初探JVM之垃圾收集器

前面大约了解了下JVM的垃圾收集算法,如果说收集算法是内存回收的方法,那么垃圾收集器就是内存回收的具体实现。现在HotSpot虚拟机都是用的G1收集器。
这里先总结下具体收集器的使用地方:
新生代:Seria,ParNew,Parallel Scavenge.
老生代:CMS,Parallel Old,Serial Old(MSC)
其实从它们处于不同的堆的代也大致能猜出它们使用了那些算法!
Serial收集器
关键字:单线程、新生代、简单高效
这个收集器是最基本,最“老”的收集器了,单线程的,主要体现在它在进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。对于限定的单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集就可以了,所以简单并高效,因为它采用的是“复制”算法,所以是用在回收新生代内存。
ParNew收集器
关键字:多线程、新生代、CMS
属于Serial的多线程版本,同样采用“复制”算法,所以回收的是新生代的内存,除了Serial收集器外,目前这个收集器只能与CMS收集器配合工作。
Parallel Scanvenge收集器
关键字:多线程、新生代、吞吐量、自适应调节策略
属于新生代收集器,采用“复制”算法,并行的收集器,与ParNew不同的是,该收集器的关注点,CMS等关注的是尽可能缩短垃圾收集时用户线程的停顿时间,而该收集器的目的是达到一个可控制的吞吐量,吞吐量就是运行用户代码时间/虚拟机总运行时间。注意GC停顿时间缩短是以牺牲吞吐量和新生代空间来换去的,新生代空间小了,回收的内存自然要小些,但是吞吐量会变大。该收集器也被视为“吞吐量优先”的收集器。该收集器还可以进行自适应调节,就是用虚拟机去管理,只需要你设置一个基本的内存数据。
Serial Old收集器
关键字:老年代、单线程、“标记-整理”
属于Seria的老年代版本,所以也是单线程的。但是回收的是老年代的内存,所以是“标记-整理”的算法。主要是在JDK1.5之前配合Parallel Scavenge使用,还有就是CMS的后备预案。
Parallel Old收集器
关键字:老年代,多线程、“标记-整理”、吞吐量
Parallel的老年代版本,所以采用“标记整理”算法,同样是多线程的。主要在吞吐量以及CPU敏感的场合使用
CMS
一种以获取最短回收停顿时间为目标的收集器。采用“标记-清除”算法。
初始标记—>并发标记—>重新标记—>并发清除
主要特点是并发收集,低停顿,但也有下列缺点:
1.CMS收集器对CPU的资源非常敏感。并发阶段,会占用一部分线程导致应用程序变慢。
2.无法处理浮动垃圾,可能出现“Concurrent Mode Failure”失败而导致另一次“Full GC”主要是因为CMD并发清理时,用户线程还在运行着,所以可能会产生新的垃圾。
3.因为是“标记-清理”算法,所以收集后会有大量空间碎片产生,不利于后面的大对象的管理
G1
当今收集器技术发展的最前沿成果之一,是面向服务端应用的垃圾收集器。主要特点有:
1.并行与并发,其它部分线程会因为GC而导致用户线程的停顿,但是G1利用多CPU,多核环境的硬件优势可以利用并发的方式让用户程序继续运行
2.分代收集,同样是在新生代与旧生代手机,但采用不同的方法去处理这两个代。可以获取更好的收集效果。
3.空间整合,G1从整体上看是基于“标记-整理”算法的,从局部看是基于“复制”算法实现的。所以不会产生空间碎片。也不会因为分配大对象空间不足而提前触发下一次gc,触发gc肯定会停顿而影响性能的。
4.可预测的停顿,降低停顿时间是G1和CMS共同的关注点,但G1除了这个以外还能建立可预测的停顿时间模型,能让使用者指定在M毫秒的运行时间内,GC时间不能超过N毫秒。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值