垃圾回收器简介
在新生代和老年代进行垃圾回收的时候,都是要用垃圾回收器进行回收的,不同的区域用不同的垃圾回收器。
1.Serial和Serial Old垃圾回收器:分别用来回收新生代和老年代的垃圾对象。工作原理就是单线程运行,垃圾回收的时候会停止我们自己写的系统的其他工作线程,让我们系统直接卡死不动,然后让他们垃圾回收,这个现在一般写后台Java系统几乎不用。
2.ParNew和CMS垃圾回收器:ParNew现在一般都是用在新生代的垃圾回收器,CMS是用在老年代的垃圾回收器,他们都是多线程并发的机制,性能更好,现在一般是线上生产系统的标配组合。
3.G1垃圾回收器:统一收集新生代 和老年代,采用了更加优秀的算法和设计机制。
什么是Stop the World
使用JVM最大的痛点,其实就是在垃圾回收的这个过程因为在垃圾回收的时候,尽可能要让垃圾回收器专心致志的干工作,不能随便让Java系统继续对象了。
所以此时JVM会在后台直接进入“Stop the World”状态。也就是说,他会直接停止Java系统的所有工作线程,让代码不再运行。
一旦垃圾回收完毕,就可以继续恢复Java系统的工作线程的运行了,然后那些代码就可以继续运行,继续在Eden中创建新的对象。
Stop the World造成的系统停顿
假设Minor GC要运行100ms,那么可能就会导致我们的系统直接停顿100ms不能处理任何请求。
在这100ms期间用户发起的所有请求都会出现短暂的卡顿,因为系统的工作线程不在运行,不能处理请求。
所以说,无论是新生代GC还是老年代GC,都尽量不要让频率过高,也避免持续时间过长,避免影响系统正常运行,这也是使用JVM过程中一个最需要优化的地方,也是最大的一个痛点。
不同的垃圾回收器的不同的影响
我们平时常用的新生代垃圾回收器是ParNew垃圾回收器而不是Serial垃圾回收器,他针对服务器一般都是多核CPU做了优化,他是支持多线程个垃圾回收的,可以大幅度提升回收的性能,缩短回收的时间
CMS垃圾回收器,专门负责老年代的垃圾回收,他也有自己特殊的一套机制和原理,非常的复杂。他也是基于多线程的,而且可以使用一套独特的机制尽可能的在垃圾回收的过程中减少“Stop the World”的时间,避免长时间卡死我们的系统。
现在很多公司都在使用的最新的G1垃圾回收器,他更是将采用复杂的回收机制将回收性能优化到机制,尽可能更多的降低“Stop the World”的时间。
其实JVM本身的迭代演进,就是不断的在优化垃圾回收器的机制和算法,尽可能的降低垃圾回收的过程对我们的系统运行的影响。
而一个合格的Java工程师,责任就是尽可能搞懂这些垃圾回收器的运行机制和算法然后合理的对线程系统优化内存分配和垃圾回收,尽可能减少垃圾回收的频率,降低垃圾回收的时间,减少垃圾回收对系统运行的影响。
所谓的JVM优化,其实指的就是这个。