java gc 触发_Java GC种类和触发时机
jvm中分為堆和非堆
堆 = 新生代-YoungGen(eden + survivor1 + survivor2) + 老年代-OldGen(tenured)
非堆 = 永久代-PermGen
在默認情況下,新生代 = 1/3的堆空間大小,老生代 = 2/3的堆空間大小
新生代被細分成Eden和兩個survivor區域,這兩個survivor區分別被命名為from和to。默認的Eden:from:to = 8:1:1
我們常見的配置,如下:
-Xms2000m -Xmx2000m -Xmn800m -XX:PermSize=64m -XX:MaxPermSize=256m -XX:MaxTenuringThreshold=15
Xms表示jvm啟動時的初始堆大小,Xmx為最大堆大小,Xmn為新生代的大小
PermSize為永久帶的初始大小,MaxPermSize為永久代的最大空間
MaxTenuringThreshold為達到這個值,對象就會被移進老年代
基礎的概念說完了,下面通過一個圖來了解一下在jvm中創建一個新對象的時候完整的流程圖
image
jvm每次都只會使用Eden和其中的一塊survivor(可能是from,也可能是to)來為對象服務,所以無論什么時候,總是有一塊survivor區域是空閑的。
GC分為兩種:major GC和minor GC,老年代中采用標記-清除算法的Full GC(或稱為Major GC),新生代中采用復制算法的Minor GC。新生代是GC收集垃圾的頻繁區域。默認對象在survivor中每熬過15次Minor GC時,就會被晉升到老年代中。這個15是可以配置的。Full GC發生的次數不會有Minor GC那么頻繁,并且做一次Full GC要比進行一次Minor GC耗時更長。
在我們程序中,每次調用System.gc(),是先進行Minor GC,然后再進行Full GC
新生代-新創建的對象
老年代-經過多次Minor GC和Full GC回收,而沒有被回收的對象或者大對象
永久代-jvm加載的類文件信息,常量,靜態變量等
最后,總結一下jvm采用分代垃圾回收方式的原因:
1.Java程序在運行的時候,大多數對象在創建后很快就沒有對象使用它了。
2.大多數一直在被使用的對象很少再去引用新創建的對象。
總結
以上是生活随笔為你收集整理的java gc 触发_Java GC种类和触发时机的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java通用解析excel_java读取
- 下一篇: 星外php使用教程_星外PHP5.2.1