程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> JDK 7新特性簡介

JDK 7新特性簡介

編輯:關於JAVA

JDK7 新特性系列之一 總覽

JDK 全稱 Java Development Kit,是一套供 Java 開發人員使用的軟件開發工具, 其中包括了 JRE(Java Runtime Environment),以及 Java、Jar、Javac、 Javap、Javah、Javaws 等工具。自從 Sun 公司 於 2006 年 12 月 11 日發布 JDK6 到 Oracle 公司於 2011 年 7 月 28 日發布 JDK7,歷時長達 5 年之久,期間經歷了 不少大大小小的事件。所以首先,讓我們來回顧一下 JDK7 發展歷史上的風風雨雨。

2009 年 1 月,Sun 開始開發 JDK7 Milestone 1。

2009 年 11 月,Sun 在 Devoxx 2009 大會上宣布將閉包特性加入 JDK7,並將 JDK7 的發布日 期推遲到 2010 年底。

2010 年 4 月,Oracle 收購 Sun。

2010 年 9 月,Mark Reinhold 在 JavaOne 大會 上宣布 JDK7 將砍去 Lambda、Jigsaw 和部分 Coin 新特性並於 2011 年中發布,其余部分的新特性將於 2012 年底同 JDK8 一同發布。

2010 年 10 月,IBM 宣布加入 OpenJDK,將與 Oracle 合作共同開發 JDK。此後,Apple 和 SAP 也陸續加入 OpenJDK 社區。

2011 年 7 月 28 日,Oracle 正式發布 JDK7,並指定 OpenJDK7 為參考實現。

2011 年 9 月 19 日,IBM 正式發布 IBM JDK7。

在經歷了推遲發布,Sun 被收購,新特性刪減,再推遲發 布等一系列事件之後,JDK7 終於還是來到了大家的面前,那麼 JDK7 到底有哪些重要的新特性呢?本系列文章將為讀者逐 一展現。

JSR292:支持動態類型語言(InvokeDynamic)

圖 1. 項目圖標--達芬奇設計的直升機

近年來越來越多 的基於 JVM 的動態語言的出現,對於 JVM 提出了新的需求和挑戰。其實在 JDK6 中就已經支持 JSR223:Java 平台上的腳 本語言,通過一個腳本語言引擎在 JVM 上執行 JavaScript 等腳本語言。但由於 JVM 本身的設計原來是針對 Java 這種靜 態類型語言的,所以腳本語言無論是解釋執行,或者是編譯時用虛擬類型,還是運用反射機制,都會對執行效率產生很大程 度的影響。

JSR292 的實現增加了一個 InvokeDynamic 的字節碼指令來支持動態類型語言,使得在把源代碼編譯成 字節碼時並不需要確定方法的簽名,即方法參數的類型和返回類型。當運行時執行 InvokeDynamic 指令時,JVM 會通過新 的動態鏈接機制 Method Handles,尋找到真實的方法。

有了 InvokeDynamic,動態類型語言在 JVM 上的執行速度 得到了大大提升,具體的實現細節和實例將在今後的系列文章中有詳細介紹。

G1 垃圾回收器(Garbage-First Collector)

G1 垃圾回收器是一個服務器端的垃圾回收器,針對大內存多核 CPU 的環境,目的在於減少 Full GC 帶來的暫停次數,增加吞吐量。從長遠來看,G1 會代替 Concurrent Mark-Sweep Collector(CMS)。實現上,G1 在堆上 分配一系列相同大小的連續區域,然後在回收時先掃描所有的區域,按照每塊區域內存活對象的大小進行排序,優先處理存 活對象小的區域,即垃圾對象最多的區域,這也是 Garbage First 這個名稱的由來。G1 把要收集的區域內的存活對象合並 並且復制到其他區域,從而避免了 CMS 遇到的內存碎片問題。此外,G1 采用了一個可預測暫停時間模型來達到軟實時的要 求。

JSR334:小的語言改進(Project Coin)

Coin 項目提供了一系列語言上的改進,為 Java 開發者提供 了更多的便利。其中包括了支持 String 的 switch 語句,在 try 之後自動關閉資源(try-with-resources),更簡潔的 泛型,數字可以用下劃線分割和多重 catch 的改進等等。

核心類庫改進

ClassLoader 新增 API

為了 防止自定義多線程 ClassLoad 產生的死鎖問題,java.lang.ClassLoader 類增加了以下 API。

protected Object getClassLoadingLock(String className)
protected static boolean registerAsParallelCapable()

詳 細信息請參考 JDK7 的 官方文檔。

URLClassLoader 新增 API

URLClassLoader 新增 close 方法可以關閉該 類加載器打開的資源。

Concurrent 包的改進

java.util.concurrent 包引入了一個輕量級的 fork/join 的 框架來支持多核多線程的並發計算。此外,實現了 Phaser 類,它類似於 CyclicBarrier 和 CountDownLatch 但更靈活。 最後,ThreadLocalRandom 類提供了線程安全的偽隨機數生成器。

國際化(i18n)

支持 Unicode 6.0。改進 java.util.Locale 以支持 IETF BCP 47 和 UTR 35,並且在 get/set locale 的時候分成了用於顯示的 locale 和用於格 式化的 locale。

I/O 與網絡

Java 平台的更多新 NIO 2 的 API(JSR 203)

NIO2 主要包括了 3 個 方面的改進:

新的文件系統 API 支持大量文件屬性的訪問、文件系統監控服務、平台相關的 API,如 DosFileAttributes 和 PosixFileAttributes 等,以及一個可插拔文件系統的 SPI。

Socket 和文件的異步 IO。

Socket channel 的功能完善,支持 binding、多播等。

支持 zip/jar 的 FileSystemProvider 實現

NIO2 提供了新的 service provider java.nio.file.spi.FileSystemProvider 來實現一個文件系統,並在 demo 中提供了一個 zip/jar 的文件系統示例。

SCTP(Stream Control Transmission Protocol)

實現了 SCTP 協議,即流控制傳輸協議,由 RFC 2960 規范 。它是一種類似於 TCP 的可靠傳輸協議。SCTP 在兩個端點之間提供穩定、有序的數據傳遞服務(非常類似於 TCP),並且 可以保護數據消息邊界(例如 UDP)。然而,與 TCP 和 UDP 不同,SCTP 是通過多宿主(Multi-homing)和多流(Multi- streaming)功能提供這些收益的,這兩種功能均可提高可用性 。

SDP(Socket Direct Protocol)

SDP,套接 字定向協議,提供了高吞吐量低延遲的高性能網絡連接。它的設計目標是為了使得應用程序能夠透明地利用 RDMA(Remote Direct Memory Access) 通信機制來加速傳統的 TCP/IP 網絡通信。最初 SDP 由 Infiniband 行業協會的軟件工作組所指 定,主要針對 Infiniband 架構,後來 SDP 發展成為利用 RDMA 特性進行傳輸的重要協議。JDK7 這次實現 Solaris 和 Linux 平台上的 SDP。

使用 Windows Vista 上的 IPv6 棧

更新了網絡方面的代碼,在 Windows Vista 上, 當 IPv6 棧可用時,優先使用 IPv6 棧。

圖形界面客戶端

Swing 的 Nimbus 外觀感覺

Nimbus 是 Swing 上新一代的跨平台外觀感覺 (Look & Feel)。其實 Nimbus 在 Java 6 中已經存在,但直到 Java 7 才被移到了 標准 Swing 的名字空間(javax.swing)。原來 Java 中的默認的跨平台外觀感覺是“金屬”(Metal)或者被稱為 Java 外觀感覺。Nimbus 起初作為一個開源的項目,它使用 Java2D 矢量繪圖而不是點陣圖片來渲染圖形界面控件,因而使得圖 形界面控件可以精確地被任意縮放。這個特性特別符合現代富客戶端圖形控件的發展趨勢。以下圖片是 JDK 自帶的 SwingSet2 演示使用 Nimbus 外觀感覺的效果。

圖 2. SwingSet2 使用 Nimbus 的效果

更多詳細教程,可以參考 Numbus 官方教程。

JLayer

通常情況下,自定義圖形控件的繪制需要覆寫控件的繪圖方法,但是很多情況下這不是一個好辦法。於是,JLayer 類應 運而生,它可以被裝飾在已有的 Swing 組件上。這樣界面組件不需要被修改就可以完成自定義渲染和事件響應。一個例子 是給一個窗口的所有控件裝飾自定義的背景,比如模糊界面所有像素。如果你對此感興趣,可以參考 JLayer 官方教程。

混合重量級和輕量級組件

在 Java 圖形控件中有兩類,重量級(heavyweight)和輕量級(lightweight)控件。輕量級控件沒有對應的操作系統 本地控件,比如大多數 Swing 控件:JLabel 和 JButton。重量級控件則相反,對應於本地控件,比如 AWT 的 Button 和 Label。歷史上,在一個窗體裡混合使用重量級和輕量級控件存在問題,特別是它們互相重疊的時候。現在,Java 7 中混合 使用變得比較方便。

不規則和透明窗體

Java 7 中正式將創建不規則和透明窗體的 API 引入了公開的 AWT 包。當然,這些很炫的功能需要系統底層圖形界面的 支持。以下列出了相關 API

GraphicsDevice.isWindowTranslucencySupported(WindowTranslucency)

GraphicsConfiguration.isTranslucencyCapable()

Window.setOpacity(float)

Window.setShape(Shape)

Window.setBackground(Color)

詳細內容可以查看教程“How to Create Translucent and Shaped Windows”,了解如何使用透明不規則窗體的 API。

其他模塊

XML

將最新的 XML 組件更新到相關開源實現的穩定版本:JAXP 1.4、JAXB 2.2a、JAX-WS 2.2。

Java 2D

對於現代 X11 桌面系統,提供了基於 XRender 的渲染管線。

加入了 OpenType/CFF 字體的支持。

對 Linux 字體更好的支持,使用 libfontconfig 來選擇字體。

安全 / 加密

橢圓曲線加密算法 (ECC),提供了一個可移植的標准橢圓曲線加密算法實現,所有的 Java 應用都可以使用橢圓曲線加 密算法。

JSSE(SSL/TLS)

在證書鏈認證中設置關閉弱加密算法,比如 MD2 算法已經被證實不太安全。

增加對 TLS(Transport Layer Security) 1.1 和 1.2 的支持,它們對應的規范分別是 RFC 4346 和 RFC 5246。

SNI(Server Name Indication) 支持,其規范定義在 RFC 4366。

TLS 密鑰重新協商機制,RFC 5746。

數據庫連接 (JDBC)

支持了規范 JDBC 4.1 和 Rowset 1.1。

IBM JDK 7 新特性

除了以上提到的 JDK 7 新增規范外,IBM JDK 7 還有其獨一無二的新特性。IBM JDK 7 支持更多的 IBM 平台,例如 AIX、z/OS、IBM i 平台,並且在這些 IBM 的軟硬件平台上利用了特有硬件指令進行了性能優化,使得 IBM JDK7 搭配 IBM 平台的性能比其它同級別組合要快出不少。此外,在其他同等平台環境下,IBM J9 JVM 也有著出色的性能,並且針對一些 特定的情況也做了不少特殊的優化,使得在這些情況下取得比其他 JDK 7 更好的性能。

和 OracleJDK 開始引入 G1 垃圾收集器來減少 Full GC 暫停次數一樣,IBM JDK7 默認使用分代並發式垃圾收集器(參數是 -Xgcpolicy:gencon)。 IBM JDK 7 中還引入了評估版的實時增量垃圾收集策略(參數是 -Xgcpolicy:metronome)來更好地配合 WebSphere RealTime。

總結

本篇總覽簡單介紹了 JDK7 的主要新特性。盡管遺憾的是像 Lambda、Jigsaw 和 Coin 中對集合的改進等被迫被推遲到 JDK8,但是可以欣喜得發現,恰如 Java 最初的設計白皮書所說,Java 正在成為一個越來越全面和健壯安全的平台,而其 語言又不失簡潔明了。在接下來的系列文章中,我們將著重詳細介紹 InvokeDynamic、G1、NIO2、Coin 等比較重要的特性 ,敬請期待。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved