程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java技術,IBM風格: Java技術的新紀元

Java技術,IBM風格: Java技術的新紀元

編輯:關於JAVA

預計於今年秋天將最終發布的 Java 平台最新更新意義重大且倍受期待。雖然尚未通過 Java Community Process (JCP) 正式創建 Java 7 平台 Java Specification Request (JSR),並且最終特性集仍然未知,但 Oracle 推出的 Early Access 下載以及 Oracle 團隊的公開聲明為我們理解 Java SE 7 的內容提供了一些幫助。

預計特性分為以下四類:

非 Java 語言支持

“易於開發” 更新

模塊化支持

可伸縮性更新

非 Java 語言支持和 JSR 292

Java 7 將提供一些增強,可允許動態類型語言的編譯器實現程序更加輕松地為 Java 運行時生成實現,並允許這些實現以更高的性能運行。JSR 292 是變化的推動力。它引入了新的字節碼和一系列新的 Java 類。

大多數情況下,Java 語言是強類型的,這需要指定在方法中傳遞或返回的參數類型。但是,在字節級,Java 則更加偏向於弱類型:操作數棧中的變量僅在屬於相關原始類型或者一般為對象引用時才需要指定類型。在幾乎所有情況中,字節級都使用弱類型。方法調用是一種例外情況,它會強制使用強類型 — 也就是說,調用方法時將使用它的完整簽名,這包括參數和返回類型。在這種情況下,需要使用已知 Java 類型對 Java 方法進行調用。這會對動態語言造成問題,比如 Ruby、Python 和 Groovy,因為它們是動態類型(類型僅在運行時為可知)。

可以采用一些機制(通常基於反射或使用生成的調用程序)來避免這些問題並允許在 JVM 上運行動態語言,但它們會受到顯著的性能影響。JSR 292 的引入旨在通過添加新 Java 字節碼 invokedynamic 以調用動態方法,並結合 Java 語言關聯機制來處理允許在運行時重寫方法結構,來解決這些問題。

“易於開發” 特性

與 Java 平台之前的發行版相同,許多新語言特性將幫助簡化常用結構所需的語法。

Project Coin

Project Coin 涵蓋眾多小變化(coins),旨在降低編寫簡單任務的復雜度,並改善生成代碼的可讀性。

switch 語句中的 String
在 Java 7 之前的發行版中,您無法在 switch 語句中使用 String 或 Object。這意味著對 String 執行 switch 式語句的唯一方法是使用一系列 if-then-else 語句或者將 String 轉換為原始類型或 enum 類型。String 在 switch 語句中的使用意味著以下簡單結構現在已經合法:

switch (myString) {
         case "one": <do something>; break;
         case "red": <do something else>; break;
         Default: <do something generic>;
}

改善泛型實例創建的類型推斷
Java 5 引入了泛型,這使它能夠對實例化過程中對一般集合類應用參數化類型,從而實現編譯時安全檢查。但是,在實現中,類型參數會有不必要的重復,例如:

Map<String, List<String>> anagrams = new HashMap<String,
List<String>>();

改進後的類型設置更改允許推斷第二個 <> 結構:

Map<String, List<String>> anagrams = new HashMap<();

簡化的 varargs 方法調用

目前,在調用接受變量長度參數的方法時,調用代碼會接收到一個編譯時警告,提示正在執行不安全的操作。借助這一新特性,該警告將移至接受變量長度參數的方法聲明中,從而在調用代碼中減少不可避免的警告的數量。

語言對集合的支持
初始化數組的語法可允許指定使用以下語法的數組:

int[] array = new int[] {0,1,2,3,4,5}

此語法現在適用於集合,例如:

List<String> numbers = ["one", "two", "three", "four",
"five"];

自動資源管理
此增強將提供一種全新的 try 語句,用於聲明一個或多個必須手動關閉的資源;例如,InputStream 或者 OutputStream。全新的 try 語法意味著,語句完成之後,所聲明的資源將自動關閉:

static String readFromFile (String file) throws IOException {
       try (BufferedReader reader = new BufferedReader(new FileReader(file)) {
               return reader.readLine();
       } // resources are automatically closed here
}

閉包(非 Coin)

包括 Scheme、Ruby 和 SmallTalk 在內的許多編程語言都允許使用閉包或 lambda 函數。閉包實現有望添加在最終 Java 7 規范中;但是,詳細實現尚不明確,因為有多個有競爭力的提議。

模塊性支持

在每個新版本的 Java 平台中,SDK 的體積都有所增長 — 這一副作用是由各種環境中可用功能增加造成的。雖然許多功能都是資源,但過大的體積和復雜性會不可避免地影響一些關鍵性能指標:下載大小、啟動時間和內存占用。

為了解決這些問題,Java 7 計劃提供一個模塊化 JDK 運行時,即 Project Jigsaw。它將允許用戶僅下載和加載運行應用程序所需的組件。此外,用戶將能夠將模塊性應用到庫和應用程序。最終實現尚未確定。

可伸縮性更新

隨著多核系統的日益普及,以及這些系統中的內核數量不斷增加,Java 語言向可伸縮性方面發展也是大勢所趨。擴展是指開發人員需要訪問可伸縮的集合、數據結構和算法。Java 語言在版本 7 中延續了在可伸縮性方面的增強,主要體現在兩個特性中: 全新的 I/O 2 以及 Concurrency 和 Collections 更新。

全新的 I/O 2

Java 平台 1.4 發行版在 JSR 51 下引入了一組全新的 I/O (NIO) API,旨在允許開發可高度伸縮的 I/O,而不需要開發本地代碼。JSR 51 主要專注於緩沖和渠道,並且提供了非阻塞復用 I/O。在版本 7 中,我們在 JSR 203 下加入了(全新的)New I/O API (NIO.2),從而進一步擴展了在 1.4 中開始的工作。

NIO.2 API 涵蓋三個主要增強領域:異步 I/O、經過更新的 SocketChannel 功能以及更強的文件系統接口。這些更新都將繼續提供生成高度可伸縮 I/O 基礎設施的功能。

異步 I/O

Java 平台版本 7 為套接字和文件引入了異步 I/O:它提供了一組全新的 AsynchronousChannel,可允許線程繼續工作,同時 I/O 也將繼續,並在稍後通知 I/O 已經完成。版本 7 提供了兩種通知機制:其一,異步 I/O 調用將返回一個 java.util.concurrent.Future 對象,它表示生成的對象,用於提供 API 以等待 I/O 完成或者輪詢其當前狀態;第二種機制是指定一個 java.nio.channels.CompletionHandler,這將在 I/O 完成時在回調中調用。

經過更新的 SocketChannel API

在 NIO.2 更新 SocketChannel API 之前,網絡渠道實現並不是網絡套接字的完整抽象:您需要使用套接字和渠道 API 來創建網絡渠道。更新解決了此問題,每個面向網絡的渠道都將實現一個新的 NetworkChannel 接口,其中定義了 bind()、getLocalAddress()、getOption() 和 setOption() 方法。此外,還通過新的 MulticastChannel 接口添加了多播支持。

經過改善的文件系統 API

經過改善的文件系統 API 修復了標准 Java File I/O API 中的一些基本問題(如在文件刪除或重命名時缺少 I/O 異常),並為需要在所提供的 API 之上使用自定義代碼執行的常見任務提供了新的支持。這包括對復制和移動文件、符號、鏈接和文件權限的支持,並提供了一個文件變更通知和監控 API。

Concurrency 和 Collections 更新

Java 5 在 JSR 166 下引入了 java.util.concurrent 包,而 Java 6 又通過 JSR 166x 對其進行了進一步的擴展。然後,Java 7 通過 JSR 166y 對並發性再次進行了更新,提供了一個全新的 fork-join 框架,即 JSR 總監 Doug Lea 口中的 “多核友好輕量級並行框架”。其他增強還包括 TransferQueue 和 Phaser。

Fork-join 框架

fork-join 框架的目標是為可分解為多個並行任務的高性能計算任務提供支持,從而允許有效利用多個處理器及內核。

典型示例演示,合並排序算法可以分解為多個並發任務。待排序數據將分解為可作為子任務獨立排序的分段,同時子任務又有可能再度分解為更加小的子任務。子任務完成之後,整合結果(合並)。流程的原理是將特定任務分解為眾多子任務,然後等待合並完成的任務。Java 7 中添加的 fork-join 框架提供了實現 fork-join 處理的基礎設施,包括池處理和工作竊取,以降低等待其他子任務完成帶來的影響。

TransferQueue

TransferQueue 是一種 BlockingQueue,但其不同之處在於提供了一個記錄的交付服務。雖然將對象成功添加到隊列中之後會返回一個將對象插入 BlockingQueue 的線程,但僅在另一個線程從隊列中刪除了對象之後才會返回負責將對象插入到 TransferQueue 中的線程。

Phaser

Phaser 類提供了一個全新的同步阻止對象,它與 Java 5 中已經引入的 CyclicBarrier 相類似,但提供了一些額外的特性。特別是動態更改注冊方數量的能力。

IBM 提供的增值特性

除了每個新的 Java 平台發行版要強制更新的特性之外(由於JVM 規范和 Java 類庫 API 的更新),每個 Java 供應商都允許向其 Java 功能包交付自己的增值特性。對於 IBM 的 Java 功能包,這些增值增強通常主要針對三個領域:性能、可靠性和可服務性。

了解 IBM 的 Java SE 7 實現

Java 運行時的性能是影響部署應用程序的投資回報率的直接因素。鑒於此,各種標准基准測試可用於模擬特定的部署場景或工作負荷類型,以便能對投資回報率有大致的理解。雖然大多數基准測試都側重於運行時性能 — 應用程序可以執行的速度 — 但 IBM 還對應用程序的初始啟動時間深感興趣。

啟動性能

Java 應用程序的啟動性能是 IBM 團隊的一個主要關注點,不僅因為啟動時間會潛在影響客戶端應用程序的適用性,還會影響服務器端應用程序的再利用和故障轉移場景的啟動時間。

在 IBM SDK for Java 5 中,IBM 提供了一個主要特性,用於以類共享的形式減少 Java 應用程序啟動和重新啟動的時間。這種方法允許將所有系統和應用程序類存儲在共享內存的持久動態類緩存中,並且處於已經過類數據驗證的狀態(很重要)。其結果是,當 Java 應用程序載入類時,大量操作會在啟動時發生,而共享內存則沒有驗證字節碼的開銷。

在 IBM SDK for Java 6 中,IBM 針對啟動性能繼續在共享類緩存中添加了中度優化的 Just-in-time (JIT) 編譯代碼。這意味著可以消除啟動過程的另一個主要開銷:編譯應用程序啟動過程中涉及的常用方法。

IBM SDK for Java 7 將進一步改善啟動性能,專注於在共享緩存中存儲更多數據以及在多線程上執行單線程啟動活動等領域。

運行時性能

Java 應用程序的性能始終是大多數供應商所專注的領域。同樣,IBM 的 Java 運行時也有一個優先領域。每個 IBM 運行時發行版都力爭對上一發行版的性能進行增強。

表 1 顯示了 IBM SDK for Java 版本 5 和 6 之間的性能增強(在 AIX 上使用 IBM 32 位 Java 運行時):

表 1. IBM SDK for Java 性能表

IBM SDK for Java 結果(bops/JVM)
4 核 結果(bops/JVM)
8 核 結果(bops/JVM)
16 核 V5 87737 86686 86497 V6 102959 100731 99844   百分比增強 17.3% 16.2% 15.4%

注意:數據來自發布在 spec.org 上的 SPEC JBB2005 基准測試數據,在 IBM System p 570, 4.7 GHz 上使用 IBM Java Runtime。

還是一樣,對於 IBM SDK for Java 7 來說,運行時性能仍然十分重要。開放 beta 項目頁面 將詳細介紹最新的特性。

可靠性

Java 運行時的可靠性極為重要,這在 24x7 全天侯運行業務關鍵型應用程序時尤為突出。為了創建高度可靠的運行時,IBM 團隊在開發過程中采用了大量質量流程,並使用代碼庫結構和測試戰略來最大限度增加測試范圍和場景。

所有平台的公共代碼

自 IBM SDK for Java 5 發布以來,IBM Java 運行時實現的所有底層組件都建立在一個公共代碼庫的基礎之上,它只有很少與平台或架構相關的代碼。IBM 交付了 14 個 IBM SDK for Java 6 發行版,覆蓋 31、32 和 64 位 Windows 和大型機上的 z/OS。廣泛的硬件和操作系統配置可允許通過測試來確保大量場景的可靠性。通過擴展,查找和修復一個配置結果中的錯誤可以改善所有配置。這種廣泛的測試場景將極大地改善發現時機和同步式錯誤的可能性。

幫助塑造 IBM SDK for Java 7

開放 beta 項目 提供了對最新 IBM SDK for Java 7 beta 的許可訪問。它提供了新技術和特性的預覽版本,並允許您通過開放 beta 項目討論提供反饋。

產品組合

大多數 IBM Software Group 產品組合都使用 Java 代碼。這意味著 IBM 不僅感興趣於創建高質量、可靠的 Java 運行時,它還會對 IBM 軟件產品線執行大量測試。應用於 Java 運行時的測試場景(包括測試開源產品)將結合測試這些 IBM 軟件產品的大量典型部署和負荷場景。 這種測試廣度和深度有助於確保 IBM Java 運行時的質量和可靠性。除了 IBM Software Group 產品組合之外,許多 ISV 合作伙伴還將測試針對 IBM 運行時的各種軟件場景,進一步擴展用例覆蓋面。

可服務性

與所有供應商相同,IBM 力爭將應用程序部署做得完美無暇,但軟件開發的一個被人接受的事實是難以避免容易造成意外結果的缺陷。為了理解問題的根源並加以解決,IBM 提供了監控和診斷功能及工具來幫助排除部署 Java 應用程序過程中或者 Java 運行時中的問題。

調試功能

轉儲引擎增強

轉儲引擎支持生成各種不同類型的數據,從非破壞性系統轉儲到線程轉儲,甚至還可以選擇執行特定命令行,以及在更廣的事件條件下執行此操作。

借助 IBM SDK for Java 7,您現在可以生成新的轉儲類型,包括 “棧” 類型,它可以為導致事件的線程生成一個單一的棧跟蹤,並適用更多事件的情況,包括分配對象時發生的 “分配” 事件。

跟蹤引擎增強

跟蹤引擎可通過無檢測的方式來跟蹤 Java 運行時的內部以及在其上運行的 Java 代碼內部的狀況,包括核心類庫、中間件代碼或者您自己的代碼。除了執行引擎跟蹤代碼之外,還可允許觸發事件。從最基本的層面來說,您可以使用開關來開啟或關閉跟蹤,以便減少生成的跟蹤數據量並生成轉儲,包括新的 jstracktrace 轉儲,它提供了調用代碼棧跟蹤以及一個 “睡眠” 選項,可用於在運行代碼中插入任意延時。

Java 轉儲增強

javadump 文件包含執行運行時的狀態概要,包括對應用程序中所有線程的棧跟蹤。該文件也得到了增強。變更采用操作系統非限制(ulimits)和環境變量的形式,以及各線程的本機(C)棧跟蹤,以便更好地洞察 Java 運行時代表 Java 代碼的行為,或者任何 Java Native Interface (JNI) 代碼中發生的事件。

診斷收集器

當一般保護故障或 OutOfMemoryError 等問題事件發生時,IBM Java 運行時會生成大量診斷文件,其中包含關於問題根源的有用信息。診斷收集器(Diagnostics Collector)工具會在診斷文件創建之後運行,搜索系統轉儲、Java 轉儲、堆轉儲、Java 跟蹤轉儲和詳細 GC 日志,獲取問題的相關時間戳。然後,診斷收集器會生成一個經過壓縮的 .zip 文件,其中包含問題事件的所有診斷,以降低所占用的磁盤容量,並消除手動搜索可能存在或不存在的文件的需求。

IBM 監控和診斷工具

垃圾收集和內存可視化器(GCMV)

GCMV 提供應用程序 verbose:gc 輸出或操作系統內存監控數據的分析和視圖,並以圖形和表格的形式顯示它們。它還提供了清晰的概要,並解釋信息以生成一系列調優建議,以及檢測 Java 內存洩漏。這種解釋可允許您理解應用程序的內存使用配置文件,並通過調優改善垃圾收集器的性能。

轉儲分析器

轉儲分析器(Dump Analyzer)工具可幫助您使用操作系統級轉儲確定 Java 應用程序故障的根源。它提供一些獨立的分析器,可生成解答特定問題的特定數據。這些分析器結合在一起,共同生成關於任何問題根源及應用程序狀態的報表。

健康中心

健康中心(Health Center)是一個低開銷實時監控解決方案,可允許您獲取運行中 Java 應用程序的當前狀態。健康中心以通俗易懂的方式提供關於性能、內存使用、管理、優化和分析的信息。特別要指出的是,健康中心提供了方法分析信息,可反映方法的調用頻率以及調用棧跟蹤,並提供關於應用程序中同步代碼的信息,以及關於 Java 堆和總體流程的內存使用的數據。

內存分析器

通過使用 Diagnostic Tool Framework for Java (DTFJ) 擴展 Eclipse MAT,內存分析器(Memory Analyzer)將 Eclipse Memory Analyzer Tool (MAT) 的診斷功能引入了到 IBM Java 運行時中。此擴展允許 Java 堆分析使用操作系統級轉儲和 IBM Portable Heap Dumps (PHD),這樣您便可以診斷內存洩漏的根源,分析應用程序的內存占用,查看 Java Collections 的大小和效率,以及理解應用程序在特定時間的狀態。

結束語

Oracle 和 IBM 正在有條不紊地開發 Java 7 SDK。雖然發行版的規范和內容在不斷發生變化,但本文中的信息應該能讓您更好地理解當前的狀況。您還可以通過 Early Access 項目來持續跟蹤開發進展,從而幫助您融入開發過程並獲取關於重要特性及功能的反饋。

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