新生代回收器——ParNew

1、工作原理

ParNew垃圾回收器如果一旦在合适的时机执行Minor GC的时候,就会把系统程序的工作线程全部停掉,禁止程序继续运行创建新的对象,然后自己就用多个垃圾回收线程去进行垃圾回收,回收的机制和算法就跟之前说的是一样的。我们启动系统的时候可以指定垃圾回收器,使用-XX:+UseParNewGC选项,只要加入这个选项,JVM启动之后对新生代进行垃圾回收的,就是ParNew垃圾回收器了。

不管是老年代回收还是新生代回收,都要Stop the World,因为必须让程序停止创建新对象,才能回收垃圾对象,新生代只需要一次stop the world的时间,在此期间完成标记清除并把存活对象转到survivor或老年代。


2、ParNew垃圾回收器默认情况下的线程数量

产生跟CPU核数一样的线程数量,比如我们线上机器假设用的是4核CPU,或者8核CPU,或者16核CPU,那么此时ParNew的垃圾回收线程数就会分别是4个线程、8个线程、16个线程,这个东西一般不用我们手动去调节。


3、到底是用单线程垃圾还是多线程垃圾回收好?到底是用Serial垃圾回收器还是用ParNew垃圾回收器好?

启动系统的时候是可以区分服务器模式客户端模式的,如果你启动系统的时候加入-server就是服务器模式,如果加入-cilent就是客户端模式。他们俩的区别就是,如果你的系统部署在比如4核8G的Linux服务器上,那么就应该用服务器模式,如果你的系统是运行在比如Windows上的客户端程序,那么就应该是客户端模式

服务器模式通常运行我们的网站系统、电商系统、业务系统、APP后台系统之类的大型系统,一般都是多核CPU,所以此时如果要垃圾回收,那么肯定是用ParNew更好,因为多线程并行垃圾回收,充分利用多核CPU资源,可以提升性能。

如果你的Java程序是一个客户端程序,比如类似百度云网盘的Windows客户端,或者是印象笔记的Windows客户端,运行在Windows个人操作系统上呢?这种操作系统很多都是单核CPU,此时你如果要是还是用ParNew来进行垃圾回收,就会导致一个CPU运行多个线程,反而加重了性能开销,因为单CPU运行多线程会导致频繁的线上上下文切换,有效率开销,可能最后效率还不如单线程好。所以如果是类似于那种运行在Windows上的客户端程序,建议采用Serial垃圾回收器。

你可能感兴趣的:(JVM)