java的堆内存模型

堆内存模型

新生带

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 或者老年带

参考

一次频繁fullgc

jvm模型

fullgc时机

堆内存管理

cmsgc