- 所有的new的新生对象,都会先分配在eden区
- 什么时候触发ygc:eden区空间不够的时候
- ygc发生了什么: 清空 eden + from 中所有 no ref的对象占用的内存 将 eden + from 中的所有存活对象copy到to中的这个过程中,一些对象将会晋升到old中
-- to区放不下的
-- 存活次数超过tenuring threshold的
重新计算tenuring threshold的次数
- 什么情况下放到old区
- survivor区满
- survivor中的内容足够老
- 大对象直接进入老年代
- 动态判断对象年龄,如果survivor区中相同年龄的对象总大小大于survivor空间的一般,年龄大于或者等于该年龄的对象可以直接进入老年代
- 默认的GC算法: JDK1.6中对默认的GC 回收方式为:-XX:-UseParallelGC 年轻代为并行年老代为串行 而在JDK1.7中默认的GC回收方式则变成了-XX:-UseParallelOldGC -XX:+UseParallelGC 使用Paralle收集器 + 老年代串行 -XX:+UseParallelOldGC 使用Paralle收集器 + 老年代并行
- 什么时候触发full gc;
- 老生代空间不足
- 永久代Permanet Generation空间满
- CMS GC时出现promotion failed和concurrent mode failure
- 统计得到的Minor GC晋升到旧生代的平均大小大于旧生代的剩余空间
- System.gc()被显式调用
- 什么是Parallel Collector的悲观策略 在向Eden区申请空间时,如果Eden区不够,那么看当前申请空间是否大于Eden区的一半,如果大于则直接在old区分配,否则触发MinorGC,执行以下判断: 采用Parallel GC的情况下,当YGC触发时,会有两个检查:
1、在YGC执行前,min(目前新生代已使用的大小,之前平均晋升到old的大小) > 旧生代剩余空间大小 ?不执行YGC,直接执行Full GC : 执行YGC;
2、在YGC执行后,平均晋升到old的大小 > 旧生代剩余空间大小 ? 触发Full GC : 什么都不做。
- 观察到频繁full GC,怎么办?
- GC不掉:dump内存,使用MAT分析内存泄露在哪里?
- 可以GC掉,但是GC频繁
1. old区增加过快
2. old区太小,频繁 full gc
网易云新用户大礼包:https://www.163yun.com/gift
本文来自网易实践者社区,经作者侯本文授权发布。