您好,登錄后才能下訂單哦!
劃分對象兩種方式:
指針碰撞:java內存空間規整的請款下使用
空閑列表:java內存空間不規整的請款下使用
并發安全問題:頻繁創建對象就會存在線程不安全問題。解決方案有兩種:
1.對分配內存空間的操作進行同步處理,CAS加失敗重試機制保證保證更新操作原子性。
2.分配緩沖:給每個線程分配獨立空間(Java堆中申請一小塊私有內存),也就是本地線程分配緩沖(Tread Local Allocation Buffer,TLAB),開啟 -XX:+UseTLAB,在自己Buffer分配,空間不夠重新在Eden區申請一塊繼續使用。
TLAB可以讓每個應用線程擁有專屬的分配指針來分配空間(Eden區,默認Eden的1%),減小同步開銷。
TLAB只是讓每個線程有私有的分配指針,但底下存對象的內存空間還是給所有線程訪問的,只是其他線程無法在這個區域分配而已。當一個TLAB用滿(分配指針top撞上分配極限end了),重新申請一個TLAB.
在HotSpot虛擬機中,對象的內存布局分為:對象頭(Header)、實例數據(Instance Data)和對齊填充(Padding)
對象頭分配兩部分,一是自身運行時數據(哈希嗎HashCode)、GC分帶年齡、鎖狀態標志、線程持有鎖、偏向線程ID、偏向時間戳等。
另一種類型指針,即只想它的類元素指針,虛擬機通過這個指針來確定是哪個類的實例
對齊填充起到占位符的作用。對象的大小必須是8個字節。實例數據7個字節 填充1個,1個填充7個。
句柄:Java堆中劃分一塊內存作為句柄池,reference中存對象句柄地址,句柄中包含對象實例數據與類型數據各自的具體地址信息。
直接指針:reference直接存對象地址。
句柄的好處對象移動(垃圾回收移動對象)時只改變實例數據指針,而reference本身不需要修改。直接指針方式最大好處就是速度更快,減少指針定誒的時間開銷。對Sun HotSpot而言,它是使用直接指針訪問進行對象訪問的。
-XX:SurvivorRatio=8,表示Eden和Survivor的比值,缺省為8 表示Eden:From(Survivor):To(Survivor)=8:1:1
-XX:SurvivorRatio=2表示2:1:1
設置兩個Survivor區是為了解決碎片化的問題(復制回收算法)
長期存活情況:
Eden區8m占滿,再分配1m對象,Eden區會發生MinGC.
存活對象進入from區,年齡+1,再來垃圾回收則進入to區,年齡再+1。
再次進行垃圾回收,對象返回from區,年齡再+1, from和to區反復,因為from和to區采用復制回收算法的原因。
年齡達到15歲,屬于長期存活對象,進入老年代。
動態對象年齡判斷:
from和to區年齡加起來是from年齡的一半,就可以提前晉級,進入老年代。
空間分配擔保:HandlePromotionFailure, 不用考慮老年代空間不夠,不用考慮發生FullGC,如果擔保失敗或內存不夠也會進行一次FullGC
FullGC:當老年代空間不足時候,有from或to區升級進入老年代的時候,將會執行FullGC
泛型擦除(為了實現)
弱記憶(版本的兼容)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。