java垃圾收集算法以及垃圾收集器

1.垃圾收集算法
1.1标记清除算法
首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。缺点是:效率不高,标记清除后会产生大量不连续的碎片,空间碎片太多可能会导致当程序运行过程需要分配较大对象时无法找到足够的连续内存面不得不提前触发另一次垃圾收集动作。
1.2复制算法
为了解决效率问题,一种被称为“复制”的收集算法出现了,它将可用的内在划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对复制到另一块上面,然后再把已使用过后内存空间一次清理掉。这样使得每次都是对其中的一块进行内在回收,内在分配时就不用考虑内存碎片等复杂的情况,只要移动堆顶指针,按顺序分配内在即可。缺点是代价高,需要将内在缩小为原来的一半。
1.3标记整理算法
标记整理算法与标记清除算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活对象都向一端移动,然后直接清理掉端边界以外内存。
1.4分代收集算法
当前商业虚拟机的垃圾收集都采用“分代收集”算法,这种算法并没有什么新的思想,只是根据对象的存活周期不同将内存划分为几块。一般是把java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。在新生代中,每次垃圾收集时发现有大批对象死去,只有少量存活,那就选用复制算法,只需要会出少量存活对象的复制成本就可以完成收集。面老年代中因为对象存活高、没有额外空间对它时行分配担保,就必须使用“标记整理”或“标记清除”算法来收集。
2.垃圾收集器
垃圾收集器是内存回收的具体实现。由于场景不同,所以虚拟机往往采用多种不同收集器。
2.1 Serial收集器
单线程收集器,它在进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。(新生代收集器)
2.2 ParNew收集器
ParNew收集器其实就是Serial收集器的多线程版本。可以使用-XX:ParalleGCThreads参数来限制垃圾收集的线程数。(新生代收集器)
2.3 Parallel Scavenge收集器
CMS等收集器的关注点尽可能地缩短垃圾收集时用户线程的停顿时间,而Parallel Scavenge收集器的目标是达到一个可控制的吞吐量。所谓的吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间),虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%。Parallel Scavenge收集器提供了两个参数用于精确控制吞吐量,分别是控制最大垃圾收集停顿时间参数-XX:MaxGcPauseMillis参数及直接设置吞吐量大小的-XX:GCTimeRatio参数。(新生代收集器)
2.4 Serial Old收集器
Serial Old是Serial收集器的老年代版本,它同样一个单线程收集器,使用“标记-整理"算法。(老年代收集器)
2.5 Parallel Old收集器
Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。(老年代收集器)
2.6 CMS收集器
CMS(Concurrent Mark Sweep)收集器是一种获取最短回收停顿时间为的收集器。目前很大一部分的java应用都集中在互联网站或B/S系统的服务端上,这类应用尤其重视服务的响应速度,希望系统停顿时间最短,以给用户带来较好的体验。标记-清除算法整个过程分为四个步骤:初始标记、并发标记、重新标记、并发清除。(老年代收集器)
2.7 G1收集器
G1收集器是当前收集器技术发展最前沿的成果。G1是收集器基于标记整理算法实现的收集器,也就是说它不会产生空间碎片,这对于长时间运行的应用系统来说非常重要。它可以非常精确地控制停顿,即能让使用者明确指定一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒,这几乎实时java(RTSJ)的垃圾收集器的特性了。(整个java堆)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值