對JVM中垃圾回收機制的個人理解--新生代,老年代,永久代
就想通過這個方式看看自己看完一遍書後還記得什麼...
不管怎麼樣要先來個帥氣的開場白:有錯的地方請多指正,3q!!!!!!!!!!!!!!!!!!!!!!!
在堆中,新生代主要存放的是哪些很快就會被GC回收掉的或者不是特別大的物件(這個大就要看你是否設定了-XX:PretenureSizeThreshold 引數了)。新生代採用的複製演算法,即將新生代分為3個區:較大的Eden和兩個較小的Survivor(預設的Eden:Survivor = 8:1)。發生在新生代的GC為Minor GC 。在Minor GC時會將新生代中還存活著的物件複製進一個Survivor中,然後對Eden和另一個Survivor進行清理。所以,平常可用的新生代大小為Eden的大小+一個Survivor的大小。
老年代則是存放那些在程式中經歷了好幾次回收仍然還活著或者特別大的物件(這個大就要看你是否設定了-XX:PretenureSizeThreshold 引數了)。老年代採用的是標記-清除或者標記-整理演算法,這兩個演算法主要看虛擬機器採用的哪個收集器,兩種演算法的區別是:標記-清除可能會產生大量連續的記憶體碎片。在老年代中的GC則為Major GC。Major GC和Full GC會造成stop-the-world。
那麼什麼情況下,新生代的物件會進入老年代呢?
首先就是分配擔保機制:當Minor GC時,新生代存活的物件大於Survivor的大小時,這時一個Survivor裝不下它們,那麼它們就會進入老年代。
還有其他的情況:如果設定了-XX:PretenureSizeThreshold3M 那麼大於3M的物件就會直接就進入老年代。
還有,在新生代的每一次Minor GC 都會給在新生代中的物件+1歲,預設到15歲時就會從新生代進入老年代,可以通過-XX:MaxTenuringThreshold來設定這個臨界點。
相比較而言,在老年代中的物件比新生代中的物件不易回收許多。
JVM的方法區,也被稱為永久代。在這裡都是放著一些被虛擬機器載入的類資訊,靜態變數,常量等資料。這個區中的東西比老年代和新生代更不容易回收。
相關文章
- JVM記憶體管理、JVM垃圾回收機制、新生代、老年代以及永久代JVM記憶體
- JVM垃圾回收——新生代,老年代,永久代,Minor GC,Full GCJVMGC
- 對jvm堆中年輕代,老年代,永久代的理解JVM
- JVM - 方法區(永久代)的垃圾回收JVM
- 深入理解 JVM 之 垃圾回收機制JVM
- jvm的垃圾回收機制JVM
- JVM 垃圾回收機制JVM
- JVM垃圾回收機制JVM
- 【轉】深入理解JVM--JVM垃圾回收機制JVM
- [效能][JVM]jvm垃圾回收機制JVM
- jvm的新生代和老年代簡介JVM
- java JVM垃圾回收機制JavaJVM
- jvm垃圾回收機制 一JVM
- jvm垃圾回收機制 二JVM
- 對比Ruby和Python的垃圾回收(2):代式垃圾回收機制Python
- 秒懂JVM的垃圾回收機制JVM
- 聊聊JVM的垃圾回收機制GCJVMGC
- JVM垃圾回收機制入門JVM
- JVM垃圾回收機制(Garbage Collection)JVM
- 談談 JVM 垃圾回收機制JVM
- 關於jvm的永久代會發生垃圾垃圾回收嗎?進來便知JVM
- 理解 Java 垃圾回收機制Java
- Flutter中的垃圾回收機制Flutter
- JVM之垃圾回收機制詳解分析JVM
- JVM學習(二)——GC垃圾回收機制JVMGC
- JVM 中的垃圾回收JVM
- JVM 中的永久代JVM
- 理解JVM(七):垃圾回收器JVM
- JVM的垃圾回收機制詳解和調優JVM
- 深入理解Go-垃圾回收機制Go
- GC垃圾回收機制: 淺析與理解GC
- 垃圾回收機制,是不是這樣理解?
- 深入理解JVM(3)—垃圾回收JVM
- 面試準備之JVM的組成、垃圾回收機制面試JVM
- JVM虛擬機器-垃圾回收機制與垃圾收集器概述JVM虛擬機
- jvm垃圾分代回收演算法JVM演算法
- 深入理解JVM記憶體回收機制(不包含垃圾收集器)JVM記憶體
- JAVA垃圾回收機制和Python垃圾回收對比與分析JavaPython