jvm-垃圾收集器和內存分配策略(這只是一些關鍵點,並沒有深入理解)

1 方法區(對象類型數據)、虛擬機棧(局部變量表,操作數棧等)、本地方法棧(爲jvm使用到的Native方法服務)、堆(存放對象實例)、程序計數器(當前線程執行的字節碼的行號指示器)
2 java堆(新生代,老年代)(-Xmx和-Xms控制)
Eden空間,From Survivor空間、To Survivor空間等
3 方法區(永久代 Permanent Generation)
3.1 運行時常量池
3.2 直接內存(NIO的DirectByteBuffer)
3.3 對象的創建
內存分配
劃分可用空間:指針碰撞、空閒列表;
解決線程安全問題:對分配的內存空間的動作進行同步處理(CAS+失敗重試)、把內存分配的動作按照線程劃分在不同的空間之間進行(分配本地線程分配緩衝Thread Local Allocation Buffer 參數爲-XX:+/-UseTLAB)
初始化內存空間爲零值
對對象進行必要的設置(對象是哪個類的實例)
3.4 對象的內存佈局
3.4.1 對象頭 (對象運行時的數據(Mark Word)、類型指針)
3.4.2 實例數據(各種字段內容)
3.4.3 對齊填充
3.5 對象的訪問定位(句柄訪問、指針訪問)
4 OutOfMemoryError異常
5 垃圾收集器
Serial(Stop the World+複製算法+Client客戶端)、ParNew(多線程版本的Serial+Server服務端)、Parallel Scavenge(新生代+複製算法+並行多線程+達到某個吞吐量(運行用戶程序/(運行用戶程序+垃圾回收),後臺計算場景)、G1(???)、CMS(最短回收停頓時間+Current Mark Sweep,併發收集器+標記清除,交互場景(響應快))、Servial Old(Stop the World+標記整理算法+Client客戶端)、Parallel Old(老年代+多線程+標記整理算法)
6 Full GC + Minor GC
Full GC定義是相對明確的,就是針對整個新生代、老生代、元空間(metaspace,java8以上版本取代perm gen)的全局範圍的GC;
Minor GC和Major GC是俗稱,在Hotspot JVM實現的Serial GC, Parallel GC, CMS, G1 GC中大致可以對應到某個Young GC和Old GC算法組合;
7 java內存區詳解
JVM區域總體分兩類,heap區和非heap區。
heap區又分爲:
- Eden Space(伊甸園)(新生代)
- Survivor Space(倖存者區)(新生代)
- Old Gen(老年代)

非heap區又分: 
- Code Cache(代碼緩存區); 
- Perm Gen(永久代); 
- Jvm Stack(java虛擬機棧); 
- Local Method Statck(本地方法棧);

7.1 Eden Space字面意思是伊甸園,對象被創建的時候首先放到這個區域,進行垃圾回收後,不能被回收的對象被放入到空的survivor區域。
7.2 Survivor Space倖存者區,用於保存在eden space內存區域中經過垃圾回收後沒有被回收的對象。Survivor有兩個,分別爲To Survivor、 From Survivor,這個兩個區域的空間大小是一樣的。執行垃圾回收的時候Eden區域不能被回收的對象被放入到空的survivor(也就是To Survivor,同時Eden區域的內存會在垃圾回收的過程中全部釋放),另一個survivor(即From Survivor)裏不能被回收的對象也會被放入這個survivor(即To Survivor),然後To Survivor 和 From Survivor的標記會互換,始終保證一個survivor是空的。
7.3 Old Gen老年代,用於存放新生代中經過多次垃圾回收仍然存活的對象,也有可能是新生代分配不了內存的大對象會直接進入老年代。經過多次垃圾回收都沒有被回收的對象,這些對象的年代已經足夠old了,就會放入到老年代。
7.4 Code Cache代碼緩存區,它主要用於存放JIT所編譯的代碼。CodeCache代碼緩衝區的大小在client模式下默認最大是32m,在server模式下默認是48m,這個值也是可以設置的,它所對應的JVM參數爲ReservedCodeCacheSize 和 InitialCodeCacheSize
7.5 Perm Gen全稱是Permanent Generation space,是指內存的永久保存區域,因而稱之爲永久代。這個內存區域用於存放Class和Meta的信息,Class在被 Load的時候被放入這個區域。因爲Perm裏存儲的東西永遠不會被JVM垃圾回收的,所以如果你的應用程序LOAD很多CLASS的話,就很可能出現PermGen space錯誤。默認大小爲物理內存的1/64
7.6 Jvm Stack(java虛擬機棧); (上邊有介紹)
7.7 Local Method Statck(本地方法棧);(上邊有介紹)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章