• Java 8新特性探究(八)精简的JRE详解


    http://www.importnew.com/14926.html

     
     
     
     

    Java 8新特性探究(八)精简的JRE详解

    Oracle公司如期发布了Java 8正式版!没有让广大javaer失望。对于一个人来说,18岁是人生的转折点,从稚嫩走向成熟,法律意味着你是完全民事行为能力人,不再收益于未成年人保护法,到今年为止,java也走过了18年,java8是一个新的里程碑,带来了前所未有的诸多特性,lambda表达式,Stream API,新的Date time api,多核并发支持,重大安全问题改进等,相信java会越来越好,丰富的类库以及庞大的开源生态环境是其他语言所不具备的,说起丰富的类库,很多同学就吐槽了,java该减肥了,确实是该减肥,java8有个很好的特性,即JEP161(http://openjdk.java.net/jeps/161 ),该特性定义了Java SE平台规范的一些子集,使java应用程序不需要整个JRE平台即可部署和运行在小型设备上。开发人员可以基于目标硬件的可用资源选择一个合适的JRE运行环境。

    好处

    1. 更小的Java环境需要更少的计算资源。
    2. 一个较小的运行时环境可以更好的优化性能和启动时间。
    3. 消除未使用的代码从安全的角度总是好的。
    4. 这些打包的应用程序可以下载速度更快。

    概念

    紧凑的JRE分3种,分别是compact1、compact2、compact3,他们的关系是compact1<compact2<compact3,他们包含的API如下图所示

    使用javac根据profile编译应用程序

    javac –bootclasspath, or javac –profile <profile>

    如果不符合compact的api,则报错。

    1
    2
    3
    4
    5
    6
    7
    8
    $ javac -profile compact2 Test.java
    Test.java:7: error: ThreadMXBean is not available in profile 'compact2'
     ThreadMXBean bean = ManagementFactory.getThreadMXBean();
     ^
    Test.java:7: error: ManagementFactory is not available in profile 'compact2'
     ThreadMXBean bean = ManagementFactory.getThreadMXBean();
                         ^
    2 errors

    使用工具开发的效果

    JPEDS工具使用

    java8新增一个工具,用来分析应用程序所依赖的profile,有三个参数比较常用 -p,-v,-r

    1
    2
    3
    4
    5
    6
    7
    8
    9
    import java.util.Set;
    import java.util.HashSet;
      
    public class Deps {
      public static void main(String[] args) {
        System.out.println(Math.random());
        Set<String> set = new HashSet<>();
      }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    ************** PROFILE ********************
    jdeps -P Deps.class
    Deps.class -> /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/lib/rt.jar
       <unnamed> (Deps.class)
          -> java.io                                            compact1
          -> java.lang                                          compact1
          -> java.util                                          compact1
      
    ************** VERBOSE ********************
    jdeps -v Deps.class
    Deps.class -> /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/lib/rt.jar
       Deps (Deps.class)
          -> java.io.PrintStream                               
          -> java.lang.Math                                    
          -> java.lang.Object                                  
          -> java.lang.String                                  
          -> java.lang.System                                  
          -> java.util.HashSet 
      
    ************** RECURSIVE ********************
    jdeps -R Deps.class
    Deps.class -> /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/lib/rt.jar
       <unnamed> (Deps.class)
          -> java.io                                           
          -> java.lang                                         
          -> java.util                                         
    /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/lib/jce.jar -> /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/lib/rt.jar
       javax.crypto (jce.jar)
          -> java.io                                           
          -> java.lang                                         
          -> java.lang.reflect                                 
          -> java.net                                          
          -> java.nio                                          
          -> java.security                                     
          -> java.security.cert                                
          -> java.security.spec                                
          -> java.util                                         
          -> java.util.concurrent                              
          -> java.util.jar                                     
          -> java.util.regex                                   
          -> java.util.zip                                     
          -> javax.security.auth                               
          -> sun.security.jca                                   JDK internal API (rt.jar)
          -> sun.security.util                                  JDK internal API (rt.jar)
          -> sun.security.validator                             JDK internal API (rt.jar)
       javax.crypto.interfaces (jce.jar)
          -> java.lang                                         
          -> java.math                                         
          -> java.security                                     
       javax.crypto.spec (jce.jar)
          -> java.lang                                         
          -> java.math                                         
          -> java.security.spec                                
          -> java.util                                         
    /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/lib/rt.jar -> /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/lib/jce.jar
       java.security (rt.jar)
          -> javax.crypto                                       JDK internal API (jce.jar)
       sun.security.util (rt.jar)
          -> javax.crypto                                       JDK internal API (jce.jar)
          -> javax.crypto.interfaces                            JDK internal API (jce.jar)
          -> javax.crypto.spec                                  JDK internal API (jce.jar)

    在linux上构建profile

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    $ hg clone http://hg.openjdk.java.net/jdk8/jdk8/
    $ cd jdk8
    $ make images profiles :
    ## Finished profiles (build time 00:00:27)
    ----- Build times -------
    Start 2013-03-17 14:47:35
    End 2013-03-17 14:58:26
    00:00:25 corba
    00:00:15 demos
    00:01:50 hotspot
    00:00:24 images
    00:00:21 jaxp
    00:00:31 jaxws
    00:05:37 jdk
    00:00:43 langtools
    00:00:18 nashorn
    00:00:27 profiles
    00:10:51 TOTAL
    -------------------------
    Finished building Java(TM) for target 'images profiles'
    $ cd images
    $ ls -d *image
    j2re-compact1-image j2re-compact2-image j2re-compact3-image j2re-image j2sdk-image

    编译后compact大致的占用空间

    总结

    如今,物联网正风行一时。我们看到大量不同的设备在市场上出现,每一种的更新速度都越来越快。java需要一个占用资源少的JRE运行环境,紧凑的JRE特性的出现,希望能带来以后的物联网的发展,甚至还是会有大量的java应用程序出现在物联网上面。目前oracle也发布了针对raspberry pi的JRE了。

    另外该特性也是为java9的模块化项目做准备,模块化特性是javaer所期待的特性。他是解决业务系统复杂度的一个利器,当然OSGI也是相当的出色。但osgi对于新学者来说未免太复杂了。

  • 相关阅读:
    SpringMVC——拦截器及文件上传和下载
    SpringMVC——数据处理
    SpringMVC——返回结果及指定视图
    SpringMVC——SpringMVC配置
    SpringMVC——简介及原理简单分析
    Kakfa和其他类型消息中间件对比图
    Kafka消费者——结合spring开发
    Kafka生产者——结合spring开发
    五大浏览器-四大内核
    python中查看module和function的方法
  • 原文地址:https://www.cnblogs.com/donaldlee2008/p/5832019.html
Copyright © 2020-2023  润新知