阻礙Java獲得廣泛應(yīng)用的一個主要因素是Java程序的運行效率。Java是介于解釋型和編譯型之間的一種語言,同樣的程序,如果用編譯型語言C來實現(xiàn),其運行速度一般要比Java快一倍以上。Java具有平臺無關(guān)性,這使人們在開發(fā)企業(yè)級應(yīng)用的時候總是把它作為主要候選方案之一,但是性能方面的因素又大大削弱了它的競爭力。為此,提高Java的性能就顯得十分重要。
問題的提出
Sun公司及Java的支持者們?yōu)樘岣逬ava的運行速度已經(jīng)做出了許多努力,其中大多數(shù)集中在程序設(shè)計的方法和模式選擇方面。由于算法和設(shè)計模式的優(yōu)化是通用的,對Java有效的優(yōu)化算法和設(shè)計模式,對其他編譯語言也基本同樣適用,因此不能從根本上改變Java程序與編譯型語言在執(zhí)行效率方面的差異。
JIT(Just In Time,及時編譯)技術(shù)是個比較好的思想。它的基本原理是:首先通過Java編譯器把Java源代碼編譯成平臺無關(guān)的二進制字節(jié)碼。然后在Java程序真正執(zhí)行之前,系統(tǒng)通過JIT編譯器把Java的字節(jié)碼編譯為本地化機器碼。最后,系統(tǒng)執(zhí)行本地化機器碼,節(jié)省了對字節(jié)碼進行解釋的時間。這樣做的優(yōu)點是大大提高了Java程序的性能,縮短了加載程序的時間;同時,由于編譯的結(jié)果并不在程序運行間保存,因此也節(jié)約了存儲空間。缺點是由于JIT編譯器對所有的代碼都想優(yōu)化,因此同樣也占用了很多時間。
動態(tài)優(yōu)化技術(shù)是提高Java性能的另一個嘗試。該技術(shù)試圖通過把Java源程序直接編譯成機器碼,以充分利用Java動態(tài)編譯和靜態(tài)編譯技術(shù)來提高Java的性能。該方法把輸入的Java源碼或字節(jié)碼轉(zhuǎn)換為經(jīng)過高度優(yōu)化的可執(zhí)行代碼和動態(tài)庫 (Windows中的. dll文件或Unix中的. so文件)。該技術(shù)能大大提高程序的性能,但卻破壞了Java的可移植性。
JNI技術(shù)
實際上,有一種通常為我們忽視的技術(shù)可以在很大程度上解決這個難題,那就是JNI(Java Native Interface, Java本地化方法)。主張采用純Java的人們通常反對本地化代碼的使用,他們認為在Java程序執(zhí)行的過程中調(diào)用C/C++程序會影響程序的可移植性和安全性。還有一些人認為JNI只是對過去混合編程技術(shù)的簡單擴展,其實際目的是為了充分利用大量原有的C程序庫。
其實,我們不必拘泥于嚴格的平臺獨立性限制,因為采用JNI技術(shù)只是針對一些嚴重影響Java性能的代碼段,該部分可能只占源程序的極少部分,所以幾乎可以不考慮該部分代碼在主流平臺之間移植的工作量。同時,也不必過分擔(dān)心類型匹配問題,我們完全可以控制代碼不出現(xiàn)這種錯誤。此外,也不必擔(dān)心安全控制問題,因為Java安全模型已擴展為允許非系統(tǒng)類加載和調(diào)用本地方法。根據(jù)Java規(guī)范,從JDK 1. 2開始,F(xiàn)indClass將設(shè)法找到與當前的本地方法關(guān)聯(lián)的類加載器。如果平臺相關(guān)代碼屬于一個系統(tǒng)類,則無需涉及任何類加載器; 否則,將調(diào)用適當?shù)念惣虞d器來加載和鏈接已命名的類。換句話說,如果在Java程序中直接調(diào)用C/C++語言產(chǎn)生的機器碼,該部分代碼的安全性就由Java虛擬機控制。
JNI實現(xiàn)步驟
編寫JNI代碼的大致流程如下圖所示:
JNI實現(xiàn)流程圖
相關(guān)推薦:等考二級JAVA:Java+Flex整合應(yīng)用簡單示例北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |