堆内存模型
新生带
eden 8
survivor1 1
survivor2 1
老年带
old
正常的垃圾回收
minorgc
比较频繁
jvm 每隔一段时间就会对eden 和某一块 survivor带进行minorgc, 清空该eden和survivor, 对于依然存活的对象会放在另一个survivor 中, 放不下的会放在 老年带old 中, 对在 survivor 中的 对象, 每经历一次 minorgc, 对象的年龄就增加1; 接下来的对象会放在已经有对象的那个survivor和old中
什么算垃圾:
有两种算法
不可触达算法
引用计数器 有循环引用的问题
进入老年带
一般年龄到 15的时候, 对象就会被老年带
如果是 大对象, 可能会提前进入老年带
如果survivor 内相同年龄大小的对象总和大于 它的一半,也会进入老年带
fullgc
fullgc / major gc 是对整个堆
比较耗时, 频率比较低, 要尽量避免 fullgc
老年带的回收
cmsgc 1.4 后引进, 高响应, 低吞吐率
对老年带的回收
…
案例
高并发条件下, 如果新生带足够大, 那么新生代的对象会在符合条件的时候进入老年带
经常老年带会进行 cms gc, 这时 很可能 老年带没空了, 就会触发 Concurrent mode failed
解决方案是增加 老年带, 更频发的触发 cmsgc
如果survivor不够, 容易间接触发Prommotion failed, 此刻可以增加 survivor 或者老年带