Java 6中的性能優化

    J2SE 6(代號:Mustang野馬)主要設計原則之一就是提升J2SE的性能和擴展能力,主要通過最大程度提升運行效率,更好的垃圾收集和一些客戶端性能來達到。

    1、偏向鎖(Biased locking)

    Java 6以前加鎖操作都會導致一次原子CAS(Compare-And-Set)操作,CAS操作是比較耗時的,即使這個鎖上實際上沒有衝突,只被一個線程擁有,也會帶來較大開銷。爲解決這一問題,Java 6中引入偏向鎖技術,即一個鎖偏向於第一個加鎖的線程,該線程後續加鎖操作不需要同步。大概的實現如下:一個鎖最初爲NEUTRAL狀態,當第一個線程加鎖時,將該鎖的狀態修改爲BIASED,並記錄線程ID,當這一線程進行後續加鎖操作時,若發現狀態是BIASED並且線程ID是當前線程ID,則只設置一下加鎖標誌,不需要進行CAS操作。其它線程若要加這個鎖,需要使用CAS操作將狀態替換爲REVOKE,並等待加鎖標誌清零,以後該鎖的狀態就變成 DEFAULT,常用舊的算法處理。這一功能可用-XX:-UseBiasedLocking命令禁止。

    2、鎖粗化(Lock coarsening)

    如果一段代碼經常性的加鎖和解鎖,在解鎖與下次加鎖之間又沒幹什麼事情,則可以將多次加加鎖解鎖操作合併成一對。這一功能可用-XX:-EliminateLocks禁止。

    3、自適應自旋(Adaptive spinning)

    一般在多CPU的機器上加鎖實現都會包含一個短期的自旋過程。自旋的次數不太好決定,自旋少了會導致線程被掛起和上下文切換增加,自旋多了耗CPU.爲此Java 6中引入自適應自旋技術,即根據一個鎖最近自旋加鎖成功概率動態調整自旋次數。

    4、常用大內存分佈的堆(large page heap)

    在大內分頁是x86/amd64架構上用來減小TLB(虛擬地址到物理地址翻譯緩存)大小的TLB失配率。Java 6中的內存堆可以使用這一技術。

    5、提高數組拷貝性能

    對每種類型大小寫一個定製的彙編數組拷貝程序。

    6、後臺進行代碼優化

    Background Compilation in HotSpot™ Client Compiler: 後臺進行代碼優化

    7、線性掃描寄存器分配算法(Linear Scan Register Allocation)

    一種新的寄存器分配策略,基於SSA(static single assignment),性能提高10%左右。常用的寄存器分配算法將寄存器分配看作圖着色問題,時間複雜度是O(n^4),不適用於Java的JIT編譯。原來的JVM裏是根據一些本地啓發式規則來分配寄存器,效果不太好,Java 6中使用的線性掃描寄存器算法能夠達到與圖顏色算法相似的效果,並且時間複雜度是線性的。

    8、並行縮並垃圾收集器(Parallel Compaction Collector)

    進行Full GC時使用並行垃圾收集(JDK 5裏原來非Full GC是並行的但Full GC是串行的),使用-XX:+UseParallelOldGC開啓這一功能

    9、並行低停頓垃圾收集器(Concurrent Low Pause Collector)

    顯式調用gc(如System.gc)時也可以並行進行標記-清掃式垃圾收集,使用-XX:+ExplicitGCInvokesConcurrent開啓。

    10、Ergonomics in the 6.0 Java Virtual Machine

    自動調整垃圾收集策略、堆大小等配置,這一功能在JDK 5中加入,JDK 6中得到顯著增強,SPECjbb2005性能提高70%.

    11、boot類裝載器的優化

    jre中增加一個描述package所在jar文件的元索引文件,加快classloader加載類性能,提高桌面Java應用啓動速度(+15%)。內存佔用也減少了10%

    12、圖形程序優化

    在jvm啓動之前顯示splash.

    Swing程序中每個窗口有一個後臺顯示緩存,當該窗口原來被遮擋,現在要顯示時直接從該緩存拷貝數據進行渲染,即使該窗口的繪製線程被阻塞也可以完成這一渲染。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章