-
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…