GC知识整理
2021-02-01 10:33:03 104 举报
垃圾回收(GC)是Java虚拟机(JVM)自动管理内存的一种机制,它会自动回收不再使用的对象所占用的内存。GC的主要任务包括标记、清除和整理。标记阶段,GC会遍历所有的对象,找出哪些对象已经不再使用;清除阶段,GC会回收那些被标记为不再使用的对象所占用的内存;整理阶段,GC会将剩余的对象移动到内存的一端,以便为新的对象分配内存。GC的类型主要有分代收集算法和分区收集算法两种。分代收集算法是根据对象的存活周期将内存分为新生代和老年代,新生代的GC频率较高,老年代的GC频率较低。分区收集算法则是将内存分为多个区域,每个区域的GC频率可以独立设置。
作者其他创作
大纲/内容
老年代
Young GC
再次进入stw,速度很快的,他其实就是对在第二阶段中被系统程序运行变动过的少数对象进行标记,所以运行速度很快
并发标记
并发清理
新生代进入老年代
Old GC
新生代
ParNew回收器
Metaspace区域满了
重新标记
初始标记
CMS标记清理算法
Full GC
这个阶段是很耗时的,因为需要进行对象的清理,但是他是跟系统程序并发运行的,所以其实也不影响系统程序的执行
新生代进入老年代的条件:新生代对象经历15次垃圾回收后,会进入老年代;通过jvm参数,-XX:MaxTenuringThreshold来设置,默认15大对象直进入老年代,通过JVM参数 -XX:PretenureSizeThreshold来设置动态年龄判断:放对象的survivor区,一批对象总大小大于这块Survivor区域的50%,那么此时大于等于这批对象的年龄,可直接进入老年代。老年代空间分配担保原则:1.Young GC之前,检查老年代最大可用的连续空间是否大于新生代所有对象的总空间。1️⃣如果大于,则此次Minor GC是安全的,即使Young GC之后所有对象都存活,Survivor区放不下了,也可转移到老年代。2️⃣如果小于,则检查老年代可用连续空间是否大于历次晋升到老年代对象的平均大小: 如果大于,则尝试进行一次Young GC, 但是这次依然是有风险的。 (1)Young GC过后,剩余存活对象的大小,是小于Survivor区域大小的,那么此时进入Survivor区域即可。 (2)Young GC过后,剩余存活对象的大小,是大于Survivor区域大小,但是小于老年代可用内存大小,此时进入老年代即可。 (3)Young GC过后,剩余存活对象大小,大于了Survivor区域的大小,也大于老年代可用内存的大小。此时老年代放不下这些存活对象了,就会发生Handle Promotion failure 的情况,触发一次Full GC。 如果小于,则改为进行一次Full GC。触发Full GC的条件:1. 触发老年代空间分配担保规则,可看上面条件2.执行了Young GC之后有一批对象需要放入老年代,如果老年代没有足够空间存放这些对象,会触发一次Full GC.3.老年代内存使用率超过92%, 也要直接触发Full GC, 可通过参数-XX:CMSInitiatingOccupancyFaction配置JVM参数:-XX:IntialHeapSize: Java堆内存的大小-XX:MaxHeapSize: Java堆内存的最大大小-XX:NewSize: Java堆内存的新生代大小-XX:MaxNewSize: Java堆内存中新生代最大大小-Xss: 每个线程的栈内存大小-XX:MetaspaceSize: 元空间大小-XX:MaxMetaspaceSize: 元空间最大大小-XX:MaxPermSize: 永久代最大大小-XX:PermSize: 永久代大小-XX:PretenureSizeThreshold: 大对象阈值-XX:MaxTenuringThreshold: 多少岁进入老年代-XX:+UseParNewGC: 指定年轻代用ParNew回收器-XX:+UseConcMarkSweepGC: 指定老年代用CMS回收器-XX: +UseCMSCompactAtFullCollection: 碎片整理-XX: CMSFullGCsBeforeCompaction: 多少次Full GC后执行碎片整理-XX: +PrintGCDetails: 打印详细的GC日志-XX: +PrintGCTimeStamps: 这个参数可以打印出来每次GC发生的时间-Xloggc:gc.log: 这个参数可以设置讲gc日志写入一个磁盘文件
系统可以创建各种新对象,可能会创建新的存活对象,也可会让部分对象失去引用,变成垃圾对象,垃圾回收线程,会尽可能的对已有的对象进行GC root追踪
元数据(永久代)常量池,类信息,static 变量
0 条评论
下一页