JVM垃圾收集器
串行垃圾回收器
使用单线程进行垃圾回收的回收期。每次回收时,串行回收器只有一个工作线程,对于并行能力较弱的计算机来说,串行回收期的专注性和独占性有更好的性能表现,串行回收器可以在新生代和老年代使用。根据作用域不同的堆空间,分为新生代串行回收器和老年代串行回收器
-XX:+UseSerialGC 参数可以设置使用新生代串行回收器和老年代串行回收器
并行垃圾回收器
可以使用多个线程同时进行垃圾回收
- ParNew回收器是一个工作在新生代的垃圾收集器,他只是简单的将串行回收器多线程化。他的回收策略和算法和串行回收器一样
-XX:+UseParNewGC 新生代ParNew回收器,老年代则使用串行回收器
ParNew回收器工作时的线程数量可以使用-XX:ParallelGCThreads参数制定。一般最好和计算机的CPU相当
ParalleGC
新生代ParalleIGC回收器,使用了复制算法的收集器,也是多线程独占形式的收集器,但ParalleIGC回收器有个非常重要的特点,就是它非常关注系统的吞吐量,提供了两个非常关键的参数控制系统的吞吐量
-XX:MaxGCPauseMillis:设置最大垃圾收集停顿时间,可以把虚拟机在GC的停顿的时间控制在MaxGCPauseMillis范围内,
如果系统减少GC停顿时间可以将MaxGCPauseMillis设置的很小,但是会导致GC频繁,从而增加了GC的总时间
,降低了吞吐量。所以需要根据实际情况设置该值。
-XX:GCTimeRatio:设置吞吐量大小
-XX:+UseAdaptiveSizePolicy打开自适应模式
ParalleIOldGC回收器
老年代ParalleIOldGC回收器也是一种多线程的回收器,和新生代的ParallelGC回收器一样,也是一种关注吞吐量的回收器,他使用了标记压缩算法进行实现。
-XX:+UseParallelOldGC 进行设置
-XX:+ParallelGCThreads也可以设置垃圾收集时的线程数量
CMS回收器
Concurrent Mark Sweep意为并发标记清楚,他使用的是标记清除法,主要关注系统停顿时间
-XX:+UseConcMarkSweepGC进行设置
-XX:ConcGCThreads设置并发线程数量
CMS并不是独占的回收器,也就是说CMS回收的过程中,应用程序仍然在不停的工作,又回有新的垃圾不断产生,所以在使用CMS的过程中应该确保应用程序的内存足够用,CMS不会等到应用程序饱和的时候才去回收垃圾,而是在某一阈值的时候开始回收,默认为68,也就是说当老年代的空间使用率达到68%的时候,会执行CMS回收。如果内存使用率增长的很快,在CMS执行的过程中,已经出现内存不足的情况,此时CMS回收就会失败虚拟机启动老年代串行回收器进行回收,这回导致应用程序终端,直到垃圾回收完成后才会正常工作,这个过程GC的停顿时间可能较长,所以-XX:CMSInitiationOccupancyFraction的设置要根据实际情况。
标记清除法有个缺点就是存在内存碎片的问题,那么CMS有个参数设置-XX:+UseCMSCompactAtFullCollection可以使CMS回收完成之后进行一次碎片整理,-XX:CMSFullGCsBeforeCompaction参数可以设置进行多少次回收之后,对内存进行一次压缩。
G1回收器
G1回收器是在jdk1.7以后提出的垃圾回收器。从长期目标来看是为了取代CMS回收器,G1回收器有独特的垃圾回收策略,G1属于分带垃圾回收器,区分新生代和老年代,依然有eden和from/to区,他并不要求整个eden区或者新生代、老年代的空间都连续,他使用了分区算法
-XX:+UseG1GC 应用G1收集器
-XX:MaxGCPauseMillis吸顶最大停顿时间
-XX:ParallelGCThreads 设置并行回收的线程数量