引言
在 Java 虛擬機(JVM)中,內存分配與垃圾回收是影響程序性能的核心機制。內存分配的高效性直接決定了對象創建的速率,而垃圾回收策略則決定了內存的利用率以及系統的穩定性。為了在復雜多變的應用場景中實現高效的內存管理,JVM 提供了多種內存分配策略,如指針碰撞、空閑列表以及 TLAB(Thread Local Allocation Buffer),并結合不同的垃圾回收器,靈活應對各種內存分配需求。
1. 指針碰撞
假設堆內存是規整的,所有使用過的內存被放到一側,空閑的內存被放到另一側,使用過的內存和空閑內存之間放著一個指針作為分界線,當有內存需要分配時,指針向空閑方向移動與對象大小相等的距離即可,這種分配方式稱為“指針碰撞”。
2. 空閑列表
如果堆內存不是規整的,已被使用的內存和空閑的內存相互交錯在一起,沒辦法使用指針碰撞分配空間,JVM會維護一個列表,記錄哪些內存塊可用,在分配的時候從列表中找到一塊足夠大的空間劃分給對象實例,并更新列表上的記錄,這種分配方式稱為“空閑列表”(Free List)。
3. TLAB(Thread Local Allocation Buffer)
也稱為本地線程分配緩沖,TLAB 是線程私有的,線程初始化的時候,會創建并初始化 TLAB。對象創建在虛擬機中是非常頻繁的行為,因此可能存在并發問題,為此提供了兩種解決方案。
方案一:內存分配動作同步完成,JVM采用CAS + 自旋的方式。
方案二:為每個線程在Java堆中預先分配一小塊內存。哪個線程要分配內存,就在哪個線程的本地緩沖區中分配。
虛擬機是否使用TLAB,可以通過-XX:+/-UseTLAB參數來設定,默認開啟。
4. 垃圾回收器如何選擇內存分配策略?
新生代基于復制的收集器,采用指針碰撞即簡單又高效,老年代基于整理、清除算法的收集器,使用較為復雜的空閑列表來分配內存。
感謝您的閱讀!如果文章中有任何問題或不足之處,歡迎及時指出,您的反饋將幫助我不斷改進與完善。期待與您共同探討技術,共同進步!