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程序中每個窗口有壹個後臺顯示緩存,當該窗口原來被遮擋,現在要顯示時直接從該緩存拷貝數據進行渲染,即使該窗口的繪制線程被阻塞也可以完成這壹渲染。