【每天学习五分钟JVM】Java虚拟机中的垃圾回收算法

这里写自定义目录标题

垃圾回收算法

实现垃圾回收的方式一般分为标记清除算法、标记整理算法及复制算法。
1.标记清除算法。算法分为标记及清除两个阶段,在标记完成后统一回收所有被标记的对象。缺点有两个:首先,此算法执行效率不高;其次为在软件运行一段时间后内存分部将比较零散,当执行完清理后将导致可用内存为许多不连续的内存碎片,当要分配大块内存时由于没有连续的可用内存将再次引发GC。标记清除算法示意图如下图。
标记清除算法示意图
**2.标记整理算法。**此算法与标记清除类似,第一阶段都为标记阶段,在此阶段对需要回收的对象进行标记。区别在于在回收内存时此算法将存活对象都向内存区域的一端进行移动,当整理阶段结束时,可用内存将为一整块连续的内存。标记清除算法示意图如下图。
标记整理算法示意图
**3.复制算法。**复制算法是将内存分为相等的两块,每次只使用其中的一块。当某一块内存用完了就将存活对象复制到另外一块内存,复制完成后直接清理整块上一次使用的内存。此算法通过牺牲空间的手段来提升效率,但在实际使用中很少会将内存1:1分为两块相等的内存。在HotSpot虚拟机的新生代中使用复制算法进行内存回收,新生代被分为了两块Survivor区和一块Eden区。HotSpot默认情况下两块Survivor区和Eden区比例是1:1:8,在内存使用时使用了一块Survivor区及Eden区,这样就只牺牲了10%的内存空间。在内存回收时会将使用中的Survivor区和Eden区的存活对象,都复制到另外一块Survivor区上。这么处理是因为新生代的内存在进行回收是由于该处内存使用的特性(一般都是在程序中生命周期短的对象),在一次回收时会回收大部分的内存,所以使用了这种内存回收策略。当然,并不能保证每次存活对象只占新生代内存的10%以内,此时就需要老年代进行内存分配担保,当新生代存活内存大于一个Survivor区大小的时候将直接将新生代所有的存活对象分配在老年代。复制算法示意图如下。
复制算法示意图

内存分代管理

在大部分虚拟机中(包含HotSpot、Dalvik)都使用分代管理的方式进行内存的管理。分代管理是根据内存的存活周期将Java内存堆划分为了不同的几块,一般分为新生代及老年代。在新生代中分配生命周期短的对象,老年代分配生命周期长的对象。(生命周期短的对象也有可能会通过内存分配担保策略分配在老年代)。
新生代内存回收一般使用复制算法进行,由于不能保证每次新生代垃圾回收时存活对象的总大小都小于等于一块Survivor区的大小,所有新生代内存回收会配合老年代的内存担保进行。“担保”这个词很容易理解–你不行那就我来上。内存担保是指在内存回收期间如果存活内存总大小大于一个Survivor分区大小,则存活的对象直接分配在老年代,在内存回收结束后这部分内存会继续留在老年代。
在内存内配时首先判断将要分配的内存是否超过了设置的新生代可分配内存大小阈值,如果大于该阈值将直接将对象分配在老年代。如果老年代内存不足将触发一次Full GC进行内存回收。如果小于该阈值将在新生代的Eden区中分配,如果Eden去没有足够的内存时将触发一次Minor GC进行新生代的垃圾回收。每次进行垃圾回收时会将存活对象进行年龄计数器加1,当存活对象的年龄超过一定阈值时该对象将被移至老年代。分配在老年代的对象为三种对象:

  • 大内存对象,内存对象大小大于了新生代可分配内存大小阈值,在分配该内存时直接在老年代分配;

  • 通过内存担保分配的至老年代的对象:在一次Minor GC时,存活对象总大小大于了一个新生代Survivor区大小,此时所有的存活对象分配在老年区。

  • 存活周期长的对象:在新生代的存活对象在经过多次Minor GC后对象年龄大于老年代年龄阈值,此时将该对象移至老年代。

Eden区和Survivor区大小配置方式:-XX:SurvivorRatio=【整数值】,默认为8
新生代可分配内存大小阈值配置方式:-XX:PretenureSizeThresHold=【数值】
存活对象老年代年龄阈值配置方式:-XX:MaxTenuringThresHold=【数值】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值