首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

重談 JVM 性能傳言:分配與 GC 為何比 C/C++ 更快?

     編輯:Java 相關知識

分配速度的反直觀真相

現代 JVM 中的物件分配(new Object())常見路徑僅需 10 條機器指令(HotSpot 1.4.2+),而 C/C++ 最佳 malloc 實作平均需 60–100 條指令。更關鍵的是,許多 C/C++ 程式(如 Perl、Ghostscript)總執行時間的 20%–30% 耗費在 malloc/free 上,遠超健康 Java 應用在分配與 GC 的開銷。

批次管理勝過逐筆管理

傳統 malloc/free 單塊處理記憶體,GC 採用批次方式,創造更多優化機會。研究表明:以保守的 Boehm-Demers-Weiser (BDW) GC 取代 malloc,許多 C++ 程式反而加速。JVM 的精確移動式收集器更能進一步優化。

分代收集與指標碰撞分配

  • 分代假設:92%–98% 物件「朝生夕死」,僅在新生代存活。
  • 複製式收集器:將堆劃為兩半,分配只需移動指標(指標碰撞),無需搜尋空閒列表。
  • TLAB(線程本地分配緩衝):每條線程預先取得大塊記憶體,小物件分配無鎖,大幅降低併發爭用。

逃逸分析與棧上分配

JVM 透過逃逸分析判斷物件是否僅在單一線程、單一棧幀生命週期內使用。若是,可直接在棧上分配,甚至將物件標量替換為暫存器欄位,完全消除堆分配開銷。Java SE 6 (Mustang) 已引入此優化。

結語

讓 JVM 根據實際運行情況在堆/棧分配間動態抉擇,開發者即可獲得棧分配的性能優勢,又無需承擔手動記憶體管理的風險與複雜度。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved