JVM内存管理机制和垃圾回收机制
JVM內存管理機制和垃圾回收機制
JVM結構
圖片描述:
JAVA代碼編譯
JAVA字節碼執行
類加載機制
加載過程中會先檢查類是否被已加載,檢查順序是自底向上,從Custom ClassLoader到BootStrap ClassLoader逐層檢查,只要某個classloader已加載就視為已加載此類,保證此類只所有ClassLoader加載一次。而加載的順序是自頂向下,也就是由上層來逐層嘗試加載此類。
類執行機制
JVM是基于棧的體系結構來執行class字節碼的。線程創建后,都會產生程序計數器(PC)和棧(Stack),程序計數器存放下一條要執行的指令在方法內的偏移量,棧中存放一個個棧幀,每個棧幀對應著每個方法的每次調用,而棧幀又是有局部變量區和操作數棧兩部分組成,局部變量區用于存放方法中的局部變量和參數,操作數棧中用于存放方法執行過程中產生的中間結果。
JVM內存組成
堆
所有通過new創建的對象的內存都在堆中分配,其大小可以通過-Xmx和-Xms來控制。堆被劃分為新生代和舊生代,新生代又被進一步劃分為Eden和Survivor區,最后Survivor由From Space和To Space組成,結構圖如下所示:
- 新生代:新建的對象都是用新生代分配內存,Eden空間不足的時候,會把存活的對象轉移到Survivor中,新生代大小可以由-Xmn來控制,也可以用-XX:SurvivorRatio來控制Eden和Survivor的比例
- 舊生代:用于存放新生代中經過多次垃圾回收仍然存活的對象
棧
每個線程執行每個方法的時候都會在棧中申請一個棧幀,每個棧幀包括局部變量區和操作數棧,用于存放此次方法調用過程中的臨時變量、參數和中間結果
本地方法棧
用于支持native方法的執行,存儲了每個native方法調用的狀態
方法區
存放了要加載的類信息、靜態變量、final類型的常量、屬性和方法信息。JVM用持久代(Permanet Generation)來存放方法區,可通過-XX:PermSize和-XX:MaxPermSize來指定最小值和最大值
垃圾回收機制
JVM針對新生代和舊生代采用了不同的GC
新生代的GC
新生代通常存活時間較短,因此基于Copying算法來進行回收,所謂Copying算法就是掃描出存活的對象,并復制到一塊新的完全未使用的空間中,對應于新生代,就是在Eden和From Space或To Space之間copy。
新生代采用空閑指針的方式來控制GC觸發,指針保持最后一個分配的對象在新生代區間的位置,當有新的對象要分配內存時,用于檢查空間是否足夠,不夠就觸發GC。
用java visualVM來查看,能明顯觀察到新生代滿了后,會把對象轉移到舊生代,然后清空繼續裝載,當舊生代也滿了后,就會報outofmemory的異常,如下圖所示:
在執行機制上JVM提供了串行GC(Serial GC)、并行回收GC(Parallel Scavenge)和并發GC(ParNew)。
在整個掃描和復制過程采用單線程的方式來進行,適用于單CPU、新生代空間較小及對暫停時間要求不是非常高的應用上,是client級別默認的GC方式,可以通過-XX:+UseSerialGC來強制指定
在整個掃描和復制過程采用多線程的方式來進行,適用于多CPU、對暫停時間要求較短的應用上,是server級別默認采用的GC方式,可用-XX:+UseParallelGC來強制指定,用-XX:ParallelGCThreads=4來指定線程數
與舊生代的并發GC配合使用
舊生代的GC
舊生代與新生代不同,對象存活的時間比較長,比較穩定,因此采用標記(Mark)算法來進行回收,所謂標記就是掃描出存活的對象,然后再進行回收未被標記的對象,回收后對用空出的空間要么進行合并,要么標記出來便于下次進行分配,總之就是要減少內存碎片帶來的效率損耗。
在執行機制上JVM提供了串行GC(Serial MSC)、并行GC(parallel MSC)和并發GC(CMS)。
你吃飯吃到一半,電話來了,你一直到吃完了以后才去接,這就說明你不支持并發也不支持并行。
你吃飯吃到一半,電話來了,你停了下來接了電話,接完后繼續吃飯,這說明你支持并發。
你吃飯吃到一半,電話來了,你一邊打電話一邊吃飯,這說明你支持并行。
| -XX:+UseSerialGC | 串行GC | 串行GC |
| -XX:+UseParallelGC | 并行回收GC | 并行GC |
| -XX:+UseConeMarkSweepGC | 并行GC | 并發GC |
| -XX:+UseParNewGC | 并行GC | 串行GC |
| -XX:+UseParallelOldGC | 并行回收GC | 并行GC |
| -XX:+ UseConeMarkSweepGC -XX:+UseParNewGC | 串行GC | 并發GC |
| 不支持的組合 | 1、-XX:+UseParNewGC -XX:+UseParallelOldGC 2、-XX:+UseParNewGC -XX:+UseSerialGC |
轉載于:https://www.cnblogs.com/cenzhongman/p/8464928.html
總結
以上是生活随笔為你收集整理的JVM内存管理机制和垃圾回收机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hadoop学习笔记03_Hive练习
- 下一篇: html显示高亮c++