课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
垃圾回收机制是程序员在学习java虚拟机知识的时候需要重点掌握的一个编程知识,而今天我们就通过案例分析来了解一下,java垃圾回收器都有哪些类型。
并发式回收器和独占式回收器
并发式垃圾回收器与应用程序线程交替工作,以尽量减少程序的停顿时间。
独占式回收器(Stoptheworld)一旦运行,就会停止应用程序中的其他所有线程,直到垃圾回收完全结束。
串行回收器和并行回收器
串行回收器是所有垃圾回收器中古老的的一种,也是JDK中基本的垃圾回收器之一,他的主要特点是使用单线程进行垃圾回收,其次,他是独占式的回收机制。
串行回收是指在同一时间段内只允许一件事情发生,也就是说,当多个CPU可用时,也只能由一个CPU用于执行垃圾回收操作,并且在执行垃圾回收期间,其他的工作线程将被暂停,当垃圾回收完全结束之后才会恢复之前被暂停的工作线程。
并行回收器是工作在新生代的垃圾收集器,它只是简单的将串行回收器多线程化,本质上和串行回收器一模一样。
并行回收器也是独占式,在回收过程中,应用程序的线程会全部暂停,但是由于并行回收器使用多线程进行垃圾回收,在并发能力比较强的CPU上,它产生的停顿时间要短于串行回收器,而在单CPU系统中,并行回收器的效果不会比串行回收器好。
压缩式回收器和非压缩式回收器
压缩式垃圾回收器会在回收完成后,对存活对象进行压缩整理,消除回收后导致的内存空间碎片。
没有整理空间碎片的步骤就叫非压缩回收器。
Serial收集器
Serial收集器是历史悠久的收集器,在早期的JKD版本中,Serial收集器是新生代的选择。
它是串行的,也是独占式的,这是它的缺点,但如果限定于单个CPU的环境来说,Serial收集器由于没有线程交互的开销,自然可以获得高的单线程收集效率。
注意:Serial收集器虽然古老,但是久经考验,在大多数情况下,性能表现是相当不错的,采用复制算法。
同时,老年代中也有Serial收集器,叫做SerialOld收集器。
ParNew收集器
ParNew收集器是一个工作在新生代的垃圾收集器,其实说白了就是Serial收集器的多线程版本,除了使用多线程进行垃圾收集之外,其他与Serial收集器相比并没有什么创新之处。
ParNew收集器也是独占式,在收集过程中,应用程序的线程会全部暂停,但是由于并行收集器使用多线程进行垃圾回收,在并发能力比较强的CPU上,它产生的停顿时间要短于Serial收集器的。
如果说ParNew收集器运行在多CPU的环境下,确实可以更快的完成垃圾收集。但是如果是在单个CPU的环境下,ParNew收集器是不如Serial高效的。
ParNew收集器只存在于新生代中。
Parallel收集器
Parallel收集器除了和ParNew收集器一样是基于并行回收以外,Parallel也同样的使用了复制算法和独占式机制。
但是不同的是,Parallel收集器的关注点不同,它的关注点是系统的吞吐量,也被称作"吞吐量优先"的收集器。吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)
需要注意的是,垃圾收集器中吞吐量和线程停顿时间是互相矛盾的,GC停顿时间缩短必须要牺牲吞吐量和新生代空间来换取,比如,系统把新生代调小一点,收集300M新生代肯定比收集500M新生代速度快,这也直接导致垃圾收集发生的更频繁,原来10秒收集一次,每次停顿100秒,现在变成5秒收集一次,每次停顿70秒,停顿时间下降了,但吞吐量也下降了。
同样的,老年代中也存在Parallel收集器,叫做ParallelOld收集器。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请在707945861群中学习了解。