您好,登錄后才能下訂單哦!
本篇內容介紹了“JVM的內存模型和垃圾回收機制”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
jvm的內存模型和heap的分代模型如上圖所示
名稱 | 是否線程共享 | 存放內容 |
虛擬機棧 | 否 | 局部變量表、方法出口等 |
本地方法棧 | 否 | native方法 |
程序計數器 | 否 | 當前線程支持的字節碼命令 |
方法區 | 是 | jvm加載的類信息、常量、靜態變量等 |
堆 | 是 | 創建的java對象 |
分代原因:提升GC性能和方便內存分配
1. 內存分配
新生代與老年代的比值大概是1:3
eden區和surviver區的比值默認8:1
2. 內存回收
幾乎所有的java對象都是在eden區出生的,當eden區沒有足夠的空間時虛擬機會發起一次minorGC,此后存活下的對象會被放到seurvier區,如果surviver區的空間不夠,則根據內存擔保原則分配到老年代。
垃圾確認原則:應用技術法與可達性分析法
引用計數法:即一個對象如果沒有任何與之關聯的引用,即他們的引用計數都不為0,則說明對象不太可能再被用到,那么這個對象就是可回收對象(可是會有循環引用的問題)。
可達性分析法:解決引用計數法的循環引用問題,如果在“GC roots”和一個對象之間沒有可達路徑,則稱該對象是不可達的。要注意的是,不可達對象不等價于可回收對象,不可達對象變為可回收對象至少要經過兩次標記過程。兩次標記后仍然是可回收對象,則將面臨回收。
miborGC(復制-》清空-》互換)流程:eden、servicorFrom 中存活對象復制到ServicorTo,年齡+1,15代之后進入老年代,大對象直接進入老年代;-》清空eden、servicorFrom;-》 ServicorTo和ServicorFrom互換。
垃圾回收內存擔保原則:老年代中的連續可用內存空間大于新生代對象總大小或者歷次晉升到老年代對象平均大小就執行minorGC,否則就fullGC.
3. 垃圾回收算法
新生代采用標記-復制算法回收內存,理論上需要一半的內存來復制對象(不易產生內存碎片,但是可用內存會被壓縮一半),但是95%的對象都是朝生夕死,所以將新生代中的復制區域劃分為8:1,也就是可以使用整個新生代內存的90%,而不是一半。
老年代采用的是標記-清除算法來回收內存,會產生不連續的內存碎片。
永久代(或者方法區)也可以回收,就是回收條件比較苛刻
java堆中不存在該類實例
該類的classLoader都被回收
該類的java.long.Class都被回收,無法通過反射訪問改方法,滿足以上三條件,方法區內的類就被回收了。
4. 垃圾收集器
名稱 | 使用范圍 | 原理 | 優缺點 |
---|---|---|---|
Serial | 新生代 | 單線程,復制算法 | 簡單高效,java虛擬機client模式下默認新生代垃圾收集器 |
ParNew | 新生代 | Serial+多線程 | ParNew收集器默認開啟和CPU數目相同的線程數,java虛擬機運行在Server模式下新生代的默認垃圾收集器,ParNew垃圾收集器在垃圾收集過程中同樣也要暫停所有其他的工作線程 |
Parallel Scavenge | 新生代 | 多線程復制算法 | 重點關注的是程序達到一個可控制的吞吐量 |
Serial Old(MSC) | 老年代 | 單線程標記整理算法 | Client默認的java虛擬機默認的年老代垃圾收集器,也會暫停所有線程 |
Parallel Old | 老年代 | 多線程標記整理算法 | Parallel Old正是為了在年老代同樣提供吞吐量優先的垃圾收集器,如果系統對吞吐量要求比較高,可以優先考慮新生代Parallel Scavenge和年老代Parallel Old收集器的搭配策略 |
CMS | 老年代 | 多線程標記清除算法 | 主要目標是獲取最短垃圾回收停頓時間, 最短的垃圾收集停頓時間可以為交互比較高的程序提高用戶體驗,總體上來看CMS收集器的內存回收和用戶線程是一起并發地執行 |
G1 | 新生代/老年代 |
| G1收集器避免全區域垃圾收集,它把堆內存劃分為大小固定的幾個獨立區域,并且跟蹤這些區域的垃圾收集進度,同時在后臺維護一個優先級列表,每次根據所允許的收集時間,優先回收垃圾最多的區域。區域劃分和優先級區域回收機制,確保G1收集器可以在有限時間獲得最高的垃圾收集效。 |
5. 結語
jvm的內存回收依賴垃圾收集器,而垃圾收集器是垃圾回收算法的具體實現,可以通過啟動參數指定不同的新生代,老年代的垃圾回收器。所有垃圾回收器的優化方向都是盡可能的降低“stop the world”的耗時,也就是垃圾回收線程執行耗時,盡可能的提高cpu的吞吐量。不同的實現方案造成了不同的垃圾回收器。如serial,parallel,cms,沒有一種能夠適應所有的垃圾回收需求,都是根據義務需求組合使用,目前最牛掰的是G1回收器,但是生產環境幾乎沒有使用。
“JVM的內存模型和垃圾回收機制”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。