年轻代的垃圾回收器Parnew

  1. parnew垃圾回收器是多线程垃圾回收机制,serial垃圾回收器是单线程垃圾回收。
  2. parnew垃圾回收器如果一旦在合适的时机执行Minor GC,就把系统程序的工作线程全部停掉,禁止程序继续运行创建新对象,然后自己用多个垃圾回收线程去回收垃圾
  3. 使用“-XX:+UseParNewGC”,指定parnew垃圾回收器
  4. parNew垃圾回收器的默认线程数量和CPU的核数是一样的

    老年代的垃圾回收器CMS

  5. CMS采用的是标记清理法去回收垃圾,但是这样会产生内存碎片。

  6. 减少stop the world的时间,CMS采用垃圾回收线程和系统工作线程尽量同时执行的模式。
  7. CMS的工作原理

① 初始标记。系统进入stop the world状态,标记出来所有被GC Roots直接引用的对象。
② 并发标记。 系统继续运行可以随意创建对象。垃圾线程会对已有的对象进行GC Roots追踪。这个阶段是最耗时的阶段
③ 重新标记。 系统进入stop the world状态,重新标记阶段二产生的新垃圾。
④ 并发清理。系统运行,清理之前标记为垃圾的对象。这个阶段也很耗时。

CMS常见参数设置

  1. 并发标记和并发清理两个阶段很耗时,但是垃圾回收线程和系统工作线程同时工作,这样会占用cpu资源。cms默认的垃圾回收线程数量是(cpu核数+3)/4.
  2. Concurrent Mode Failure。在并发清理阶段,系统运行可能会产生新的垃圾,这些垃圾没有被cms标记,所以不会被清理。所以在cms垃圾回收期间,还有一定的内存空间让一些对象进入老年代,一般会预留空间。参数-XX:CMSInitiatingOccupancyFaction参数可以设置老年代占用多少比例时触发cms垃圾回收,jdk1.6默认为92%。如果cms垃圾回收期间,系统程序要放入老年代的对象大于可用内存空间,此时会发生Concurrent Mode Failure,此时会自动用”serial Old”垃圾回收器替代CMS,直接stop the world回收垃圾。
  3. 老年代cms回收有内存碎片,内存碎片过多会触发full GC。通过设置-XX:+UseCMSCompactAtFulllCollection,默认时0,意思是每次Full GC之后都要进行一次内存整理。