Java 8新特性探究(八)精簡的JRE詳解

jopen 9年前發布 | 36K 次閱讀 Java 8 Java開發

原文出處: 成熟的毛毛蟲的博客

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. 這些打包的應用程序可以下載速度更快。
  5. </ol>

    概念

    緊湊的JRE分3種,分別是compact1、compact2、compact3,他們的關系是compact1<compact2<compact3,他們包含的API如下圖所示

    使用javac根據profile編譯應用程序

    javac –bootclasspath, or javac –profile <profile>

    如果不符合compact的api,則報錯。

    $ 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

    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<>();
      }
    }
    ************** 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

    $ 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對于新學者來說未免太復雜了。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!