什麼是 Java 7--- 高層面的目標?
幾乎所有平台的 Java 版本的發布,都涉及到 Java 語言本身 和 JVM 的各個方面。那麼對於 Java 7 來說,從 JSR 草稿中,我們得到 Java 7 的高層次的目標是:
兼容性 ― 任何在以前版本上運行的程序必須能不用做任何改變就能在 Java SE 7 中運行;
開發效率 ― 提升開發效率,最小的學習曲線;
性能 ― 新的並行 API 接口,引入了一種真正的異步 I/O API,使得 I/O 密集型的應用程序有更好的性 能;
適用性 ― 在 Java 虛擬機上能夠加速其他動態語言的性能;
可集成性 ― Java SE 7 將會包含一個新的、靈活的文件系統 API 作為 JSR203 的一部分。
Java 7 的基本的新特性
Java 語言特性的增強(JSR334)
Project Coin 主要是對 Java 語 言進行一些小的改進來提高 Java 開發人員的工作效率,這些改進有:
Switch 語句中允許使用 String 類型
清單 1. Switch 語句中允許使用 String 類型示例
switch(myString) { case “one”: <do something>; break; case “two”: <do something else>; break; default: <do something generic>; }
對於通用類型實例的創建提供類型推理
清單 2. 對通用類型實例的創建提供類型推理示例
Map<String,MyType> foo = new Map<String,MyType>(); Becomes: Map <String,MyType> foo = new Map<>(); }
Multi Catch 來處理多種異常類型
清單 3. Multi Catch 來處理多種異常類型示例
Java 6: Try { ... } catch(Exception a){ handle(a); } catch(Error b) { handle(b); } Java 7: Try { … } catch(Exception | Error a) { handle(a); }
二進制常量和數字常量示例
0b10011010 34_409_066
自動的資源管理機制
在 Java 程序中,處理所有可能的失敗路徑是困難的,關閉資源也是相對困難的,因此在 Java 7 的實現中,資 源管理獲得了編譯器的幫助,通過定義一個在資源上接口使得編譯器能夠自動在合適的時候來關閉資源,釋放 內存等資源。
自動資源管理示例
try(InputStream inFile = new FileInputStream (aFileName); OutputStream outFile = new FileOutputStream(aFileName)) { byte[] buf = new byte[BUF_SIZE]; int readBytes; while ((readBytes = inFile.read(buf)) >= 0) inFile.write(buf, readBytes); }
更多新的 I/O APIs(JSR203)
Java 7 為 Java 開發人員提供了更強大的 I/O 抽象和編程能力,真正的異步 I/O 接口的引入使得 I/O 操作能夠被更有效的處理和控制,提供了更好的可擴展性,更靈活的線程池策略。 在 JSR 203 中包含以下的 主要組件:新的文件系統接口、支持大塊訪問文件屬性、更改通知、繞開文件系統指定的 API,也是可插拔文 件系統實現的服務提供者接口; 對套接字和文件同時提供了異步 I/O 操作的 API。可被用來建立高可擴展服 務器,和多路復用 I/O 不同,異步 I/O 是讓客戶端啟動的一個 I/O 操作, 當操作完成後向客戶端發送一個 通知,異步 I/O 是通過位於 java.nio.channels 包中的一個接口和類來實現的,所有的 I/O 操作都有下列 2 種形式中的一種:
第一個返回 java.util.concurent.Future, 代表等待結果,可使用 Future 特性等待 I/O 操作 ;
第二個是使用 CompletionHandler 創建的,當操作結束時,如回調系統,調用這個處理程序。
NIO.2 中所有的異步通道如下:
AsynchronousFileChannel:讀寫文件異步通道 ;
AsynchronousSocketChannel:用於套接字的一個簡單異步通道 ;
AsynchronousServerSocketChannel:用戶 ServerSocket 的異步通道,accept() 方法是異步的,連接被 接受時,調用 CompletionHandler;
AsynchronousDatagramChannel:數據報套接字的異步通道 .
Java.util.concurent 更新(JSR203)
多核環境變得越來越普遍,因此相應的數據結構和算法都要 做出更新以匹配多核的應用開發和運行環境。在 Java 7 中提供了新的 Fork/Join 框架,它能夠很好的處理 “分治”類型的問題,對於並行計算的加速提供了相應的模型,比常用的基於線程或者執行器的同步模型更有 效率。Form/Join 框架采用了分治的技術和思想,獲取問題後,遞歸的把整個大問題分成多個小的子問題,直 到每個子問題都足夠小,使得這些小的子問題都可以高效的解決,然後把這些子問題放入隊列中等待處理 (Fork 的過程),接下來等待所有子問題的結果(Join 的過程),把多個結果合並到一起。
其他的增強 :
- TransferQueue –使得生產者 / 消費者隊列模型更加有效,TransferQueue 是一種 BlockingQueue,但其不同之處是提供了一個記錄 的交付服務;雖然將對象成功添加到隊列中之後會返回一個 將對象插入 BlockingQueue 的線程,但是僅在另一個線程從隊列裡刪除了對象之後才會返回負責將對象插入 到 TransferQueue 中的線程。
- Phaser – 引入了一個全新靈活的線程同步機制,如果你喜歡等待線 程結束然後繼續執行其他任務,那麼 Phaser 是一個好的選擇。
JSR 292 – Invokedynamic 的更新( JSR203)
JVM 已經成為了更多的動態語言 ( 例如:jruby、jython、fan、clojure、 … ) 的運行時 環境,但是卻很難使得這些動態語言更快的運行。在 Java 7 中,引入了一個新的字節碼來直接執行一個給定 的方法,並在運行時重新鏈接這些方法。
包含了一個建立一個 Mutators 的模型(添加一個參數,刪除一個參數,...)
確保 JIT 能夠有效的利用這些結構使得高效的代碼生成。
其他小的更新
類加載器的改變:通過新的“安全”API 使得並行類加載能力
I18N — Unicode 6.0,Localeenhancement,Separate user local 和 user-interface locale
TLS 1.2 —安全的更新
JDBC 4.1
Client(UI) 更新
XML 棧的更新
IBM Java 7 特有的新特性
垃圾回收器的更新和新的垃圾回收策略 -“balanced”
IBM Java 7 提供了如下 4 種不同的垃圾回收算法:
-Xgcpolicy:optthruput
-Xpcpolicy:optavgpause
-Xgcpolicy:gencon
-Xgcpolicy:balanced
對於 IBM JDK 的 GC 策略,我們做個簡單的對比,圖 1、圖 2、圖 3 分別是采用 - Xgcpolicy:optthruput、-Xpcpolicy:optavgpause、-Xgcpolicy:gencon3 種不同 GC 策略時的 Java 線程和 GC 線程的 CPU 分配時間圖。
圖 1. 采用 -Xgcpolicy:optthruput 策略的 Java 線程和 GC 線程的 CPU 分配時間圖
圖 2. 采用 -Xgcpolicy: optavgpause 策略的 Java 線程和 GC 線程的 CPU 分配時間圖
圖 3. 采用 -Xgcpolicy:gencon 策略的 Java 線程和 GC 線程的 CPU 分配時間圖
-Xgcpolicy:optthruput: 在 WAS V8 以前,這是默認的 GC 策略,通常來說,使用這種 GC 策略的應用程序更看重吞吐量,當整 個堆用完後才會進行一次 stop the world 的 GC 操作,這時應用程序會完全停止直到 GC 完成。
- Xgcpolicy:optavgpause:最優的平均暫停時間策略,這種 GC 策略適合於以下的應用場景:
應用程序無法容忍 GC 的長時間暫停,只要能減少 GC 暫停時間,適當的性能退化是可以接受的;
應用程序是在 64 位平台上運行的,並且使用了一個非常大的堆(超過 3 或者 4GB);
應用是一個 GUI 的應用程序,對響應時間有時間上的要求。
-Xgcpolicy:gencon 使用分代並發收集策略,這種 GC 策略適用於以下的應用場景:
應用程序裡有很多短生存周期的對象;
堆空間是碎片化的;
應用程序是基於 transaction 的,即 transaction 中的對象的生命周期在 transaction 提交後就會結束 。
-Xgcpolicy:balanced
平衡的垃圾回收策略,這是 WebSphere Application Server V8 以及以後的版 本中提供的新的垃圾回收策略,平衡的垃圾回收策略的宗旨是均衡暫停時間,減少一些通常與垃圾回收相關聯 的高成本操作的開銷。將全局垃圾回收的成本分擔在許多 GC 暫停上,減少整堆回收時間的影響,同時,每次 暫停應該嘗試執行一次獨立的垃圾回收,將空閒內存返回給應用程序。平衡的垃圾回收算法使用一種動態方法 來選擇要回收的堆區域,類似於 gencon 策略,但是它會在每次暫停期間考慮對堆的所有部分進行回收,而不 是僅僅考慮靜態定義的新空間。一般來說,平衡的回收策略適用於以下的場景:
應用程序在 64 位平台上運行並部署了一個大於 4GB 的堆;
應用程序可適用 gencon 獲得出色的性能,但仍然會遇到偶爾過長的全局 GC 暫停時間;
應用程序願意接受性能的細微降級;
頻繁的全局垃圾收集的應用程序;
相對多的大於 1MB 的數組需要分配的應用程序。
圖 4. 對象堆中按區域選擇的收集組
如圖 4 所示,平衡的垃圾回收算法 是一種基於區域“region”的垃圾回收算法,平衡的垃圾回收策略在 JVM 啟動的時候,將堆內存劃分有大小 相等的區域,這些區域是基本的垃圾回收和分配操作單元,通過增量回收堆區域來滿足我們對於暫停時間和快 速釋放內存給應用程序的需求,明顯的這是一種部分垃圾回收集(PGC)的方法。每個 PGC 選擇哪些區域來納 入收集組呢?主要是通過下面的 2 個要素來決定的,如圖 4 所示:
Newly Allocated 區域始終是要在回收組裡,通常來說,Newly Allocated 區域裡的對象大部分都具有較 高的死亡率;
全局標記階段發現的回收區域,一般來說,這些區域都比較零散,在圖 4 中 Fragmented 所示的部分即為 全局標記極端發現的回收區域。但是對於這些區域的回收要做碎片整理的工作。
Java 7 在 WebSphere Application Server V8.5 中的安裝配置和版本切換
在 WebSphere Application Server V8.5 中默認的 JDK 是 Java 6,用戶可以通過 WebSphere Application Server 提供的 命令或者通過 admin console 來對每個 JVM 使用的 JDK 進行配置和版本切換。
如何獲取最新版本的 IBM JDK 7?
在 IBM developWorks 網站上 http://www.ibm.com/developerworks/java/jdk/,你可以 下載到各個版本的 IBM JDK。
在 WebSphere Application Server V8.5 中,Java 7 作為一個插件包 的形式來提供的,用戶可以在安裝的時候選擇安裝 Java 7 到 WebSphere Application Server V8.5 中,這 樣就可以使用 IBM Java 7 的新特性,以獲得更好的性能,那麼如何通過 Installation Manager 來安裝 WebSphere Application Server V8.5 和 Java 7,以及如何進行 Java 的版本切換呢?下面的步驟將為你一 步一步的解答 . 一般來說,可以先安裝好 WAS,然後再通過 IM 來安裝 Java 7,或者同時安裝 WAS 和 Java 7。
在 Installation Manager 的 Preference 中設置好 Java 7 的 repository,然後在安裝的選項 中就會出現如下圖的可選項:
圖 5. Installation Manager 中 JDK7 安裝選項
然後點擊下一步,一 路默認下去,就可以在 WAS 中安裝好 Java 7。 安裝完成後,在你的 WAS 的安裝目錄下就會多出來一個 java_1.7_XX 的目錄,這就是 Java 7 的安裝目錄。但是 WAS 8.5 中默認的 JDK 版本依然是 Java 6. 那麼 如何進行版本的切換,推薦的的方法:
安裝 WAS V8.5;
安裝 Java 7 可選包;
使用‘managesdk’命令設置 Java 7 作為默認的 JDK;
創建一個 profile。
WAS V8.5 中 JDK 版本的切換是通過“managesdk”來控制完成的,命令“managesdk”控制哪個版本的 JVMs 被在 WAS 中使用,它有以下的功能:
列出 WAS V8.5 中所有可用的 JVMs;
關聯和配置 JVMs 到 profiles;
這個命令位於 app_server_root/bin 目錄下。
列出當前產品中所有可用的 Java SDK:
圖 6. 列出當前產品中所有可用的 Java SDK:
設置 Java 7 為新的 Profile 的默認 JDK:
圖 7. 設置 Java 7 為新的 Profile 的默認 JDK:
使得 Java 7 SDK 在所有的 profiles 裡生效:
圖 8. 設置 Java 7 為新的 Profile 的默認 JDK:
Java7 版本切換可能遇到的潛在的問題,在不同版本的 JVMs 之間,必須確保下面的這些項的一致性:
- 命令行選項
- 屬性文件
- 用戶添加的擴展和 Jar 包
- JNI 動態鏈接庫
- 監控
IBM 提供了一系列的 Java 7 的監控和診斷工具來支持 Java 7,主要有:垃圾回收和內存可視化工具 (GCMV)、轉儲分析器(Dump Analyzer)、健康中心(Health Center)以及內存分析器(Memory Analyzer )來幫助用戶更好的使用 Java 7。
小結
本文介紹了 IBM Java 7 的基本新特性和新的垃圾回 收算法 -balanced 的垃圾回收策略,對在 WebSphere Application Server V8.5 中如何安裝 Java 7 和怎麼 樣進行 Java 的版本切換的方法做了相應的介紹。