一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情。
前言
对新生代进行垃圾回收的时候,主要采取的是复制算法。 把新生代内存划分为两块内存区域,只使用其中一块内存,当一块内存快满的时候,就把里面的存活对象一次性转移到另外一块内存区域。接着一次性回收原来那块内存区域的垃圾对象,再次空出来一块内存区域。两块内存区域就这么重复着循环使用。
算法优化
新生代复制算法的优化: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%,那么此时大于等于这批对象年龄的对象,则直接进入老年代
- 特别大的超大对象直接不经过新生代就进入老年代
- 其他......