JVM优化之垃圾收集器
- Serial收集器
- Parallel Scavenge收集器
- ParNew收集器
如果说垃圾收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。
没有最好的垃圾收集器,只有根据具体应用场景选择适合自己的垃圾收集器。
Serial收集器
#使用方法
-XX:+UseSerialGC -XX:+UseSerialOldGC
Serial(串行)是最基本、历史最悠久的单线程收集器。它的 “单线程” 的意义不仅仅意味着它只会使用一条垃圾收集线程去完成垃圾收集工作,更重要的是它在进行垃圾收集工作的时候必须暂停其他所有的工作线程( “Stop The World” ),直到它收集结束。
Serial收集器优于其他垃圾收集器的地方在于它简单而高效(与其他收集器的单线程相比)。Serial收集器由于没有线程交互的开销,自然可以获得很高的单线程收集效率。
Serial Old收集器是Serial收集器的老年代版本,它同样是一个单线程收集器。它主要有两大用途:
- 在JDK1.5以及以前的版本中与Parallel Scavenge收集器搭配使用
- 作为CMS收集器的后备方案
新生代采用复制算法,老年代采用标记-整理算法。
Parallel Scavenge收集器
JDK8默认的新生代和老年代收集器.
#使用方法
-XX:+UseParallelGC -XX:+UseParallelOldGC
Parallel收集器是Serial收集器的多线程版本,除了使用多线程进行垃圾收集外,其余行为(控制参数、收集算法、回收策略等等)和Serial收集器类似。
默认的收集线程数跟cpu核数相同,可以用参数指定收集线程数,但是不推荐修改。
-XX:ParallelGCThreads
Parallel Scavenge收集器关注吞吐量(高效率的利用CPU)。所谓吞吐量就是CPU中用于运行用户代码的时间与CPU总消耗时间的比值。 收集器提供了很多参数供用户找到最合适的停顿时间或最大吞吐量。如果对于收集器运作不太了解的话,可以选择把内存管理优化交给虚拟机去完成也是一个不错的选择。
Parallel Old收集器是Parallel Scavenge收集器的老年代版本。使用多线程和“标记-整理”算法。在注重吞吐量以及CPU资源的场合,都可以优先考虑 Parallel Scavenge收集器和Parallel Old收集器。
新生代采用复制算法,老年代采用标记-整理算法。
ParNew收集器
#使用方法
-XX:+UseParNewGC
ParNew收集器和Parallel收集器类似,区别主要在于它可以和CMS收集器配合使用。新生代采用复制算法。
它是许多运行在Server模式下的虚拟机的首要选择,除了Serial收集器外,只有它能与CMS收集器配合工作。