參考:
- 視頻
- 書籍:《深入理解Java虛擬機-第3章 垃圾收集器與內存分配策略》
1.運行時數據區
1.1程序計數器
線程在執行Java方法:虛擬機字節碼指令的地址
線程在執行Native方法:Undifined
唯一一個沒有OutOfMemoryError的區域
1.2堆
存放對象和數組(數組也是對象)
OutOfMemoryError原因:創建的對象太多
1.3虛擬機棧
描述Java方法執行的內存模型(爲字節碼服務),每個方法在執行的時候都會創建一個棧幀,用於存儲局部變量表、操作數棧、動態鏈接、方法出口等信息。
OutOfMemoryError原因:執行的方法太多
1.4本地方法棧
描述Native方法執行的內存模型,其他和虛擬機棧類似。
OutOfMemoryError原因:執行的方法太多
1.5方法區
已加載類的信息、常量、靜態變量、即時編譯後的代碼
OutOfMemoryError原因:加載的類或常量等太多
2.判斷對象已死的方法
2.1 引用計數法
無法解決對象循環引用的問題
2.2 可達性分析(首選)
2.3 引用分類
2.4 垃圾回收算法
2.4.1標記-清除算法
先逐個標記,再逐個清除垃圾。
缺點:效率不高,還產生大量的碎片。
2.4.1複製算法
每次使用一半的內存,用完一半時,把存活的對象複製到另一半區域,再對使用過的區域整體清理。
缺點:內存代價太高。
2.4.1標記-整理算法
先標記,再把活對象前移,最後把剩餘的空間清理。
2.4.1分代蒐集算法(首選)
Java堆分爲新生代和老年代,根據各年代的生存週期選擇合適的算法。
新生代:複製算法(多數死,少量活)
老年代:標記-清除和標記-清理。(少數死,多數活)
3. 垃圾收集器
3.1 Serial收集器
單線程,Stop The World
3.2 ParNew
多線程,Stop The World
3.3 Parallel Scavenge
新生代收集器,複製算法,並行的多線程收集器
特點是自調節策略,可控制垃圾處理的時間
3.4 Serial Old
Serial的老年代版本,單線程,標記整理算法
3.5 Parallel Old
Parallel Scavenge的老年版本
3.5 CMS收集器