JVM----垃圾回收

1.對象的創建
2.對象的內存分配方式
3.對象的內存結構
4..對象的訪問方式
5.如何判斷對象已死?
6.垃圾收集算法
7.垃圾收集器


1.對象的創建
1.先查看常量池定位到這個類的符號引用;2.然後查看這個類是否被加載、解析和初始化過,如果沒有則執行;3.給新建對象分配內存
https://blog.csdn.net/tjiyu/article/details/53923392


2.對象的內存分配方式
1.指針碰撞:如果java堆是規整的,即所有用過的內存放在一邊,沒有用過的內存放在另外一邊,並且有一個指針指向分界點,在需要爲新生對象分配內存的時候,只需要移動指針畫出一塊內存分配和新生對象即可;
2.空閒列表:當java堆不是規整的,意思就是使用的內存和空閒內存交錯在一起,這時候需要一張列表來記錄哪些內存可使用,在需要爲新生對象分配內存的時候,在這個列表中尋找一塊大小合適的內存分配給它即可。而java堆是否規整和垃圾收集器是否帶有壓縮整理功能有關。


分配在新生代或老年代,如何進入老年代

默認新建對象放在新生區的Eden

如果新建的對象大於某一個值,直接存入老年區

新生代的對象沒進行一次minor GC,有一個值就+1,大於15是就轉移到老年區




3.對象的內存結構

對象頭:(hash值.........,類引用)
實例數據
對其填充,總位數爲8的整倍數。
https://blog.csdn.net/zhoufanyang_china/article/details/54601311


4.對象的訪問方式
指針直接訪問,指針直接指向對象的內存地址(快)
使用句柄訪問,jvm中會建立一個句柄池,引用指向句柄池,句柄池指向對象實例數據和對象類型數據(對象被移動回收,不用修改引用地址,只用修改句柄地址)
https://blog.csdn.net/jcncsdn/article/details/51317302


5.如何判斷對象已死?
引用計數算法:某一個對象被別的對象引用,值+1(無法避免對象相互引用的情況)
可達性分析:GC root
https://blog.csdn.net/sbvfhp/article/details/43371415


6.垃圾收集算法
標記-清除:可達性分析,可達對象加標記,清理沒有標記的對象。(會產生很多空間不連續的內存碎片)
複製:將可用內存分半,每次只使用一塊,當一塊使用完之後,將仍存活對象複製到另一半上,此時使用另一半保存對象。(無空間碎片,缺點內存利用率比較低(正常是8:1:1,分配擔保))
標記-整理
可達性分析,可達對象加標記,將標記的放在前面,未標記的放在後面,清理沒有標記的對象。
分代收集算法
新生代對象絕大多數是朝生夕死,因此使用複製算法,老年代則使用標記-整理算法
https://blog.csdn.net/u011080472/article/details/51324103


7.垃圾收集器
serial(單,新),因爲沒有現成交互,效率更高,但是多CPU則不適用了
serial old(單,老)
parnew(多,新)
parallel(多,新,可控制的吞吐量吞吐量=運行用戶代碼的時間/(運行用戶代碼的時間+垃圾收集時間)。),垃圾收集時間(手機時間不能超過這個值),直接設置吞吐量大小)
parallel old(多,老,可控制吞吐量)
cms(並行和併發,初始標記,併發標記,重新標記,併發清除)(確定,對CPU太敏感,收集分走一部分CPU,浮動垃圾,)
g1(初始標記,併發標記,最終標記,併發清除)並行與併發,分代收集,收集方式是內存空間較整齊,可預期收集;將對分爲多個獨立相等的獨立區域
https://blog.csdn.net/u011116672/article/details/50994096

發佈了25 篇原創文章 · 獲贊 28 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章