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運行環境。java

好處

1.更小的Java環境須要更少的計算資源。linux

2.一個較小的運行時環境能夠更好的優化性能和啓動時間。api

3.消除未使用的代碼從安全的角度老是好的。安全

4.這些打包的應用程序能夠下載速度更快。併發

概念

緊湊的JRE分3種,分別是compact一、compact二、compact3,他們的關係是compact1<compact2<compact3,他們包含的API以下圖所示oracle

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

javac –bootclasspath, or javac –profile <profile> dom

若是不符合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對於新學者來講未免太複雜了。

相關文章
相關標籤/搜索