JVM 调优简要思想及简单案例 - 新生代回收算法
前言
对新生代进行垃圾回收的时候,主要采取的是复制算法。把新生代内存划分为两块内存区域,只使用其中一块内存,当一块内存快满的时候,就把里面的存活对象一次性转移到另外一块内存区域。接着一次性回收原来那块内存区域的垃圾对象,再次空出来一块内存区域。两块内存区域就这么重复着循环使用。
算法优化
新生代复制算法的优化:1 个 Eden 区和 2 个 Survivor 区默认情况下,Eden 区占新生代 80%内存空间,每一块 Survivor 区各占 10%内存空间。
刚开始对象都是分配在 Eden 区内的,如果 Eden 区快满了,此时就会触发垃圾回收。此时会把 Eden 区中的存活对象都一次性转移到一块空着的 Survivor 区。接着 Eden 区就会被清空,然后再次分配新对象到 Eden 区里,如果 Eden 区再次满了,那么再次触发新生代 GC,就会把 Eden 区和放着上一次新生代 GC 后存活对象的 Survivor 区内的存活对象,转移到另外一块 Survivor 区去。
默认设置下,当对象在经历 15 次新生代 GC 后仍然存活,他就会转移到老年代里去。如果在新生代 GC 之后发现剩余的存活对象太多了,没办法放入另外一块 Survivor 区,这个时候就必须得把这些对象直接转移到老年代去。
其他情况下的分配机制:
动态对象年龄判断,Survivor 区域中,一批对象的总大小大于了这块 Survivor 区域的内存大小的 50%,那么此时大于等于这批对象年龄的对象,则直接进入老年代
特别大的超大对象直接不经过新生代就进入老年代
其他......
版权声明: 本文为 InfoQ 作者【zarmnosaj】的原创文章。
原文链接:【http://xie.infoq.cn/article/be5af8b838b6a8a262a2a5665】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论