jvm垃圾收集器以及GC日志分析

垃圾收集器

Serial:单线程收集器,GC时会采用StopWorld方式挂起所有执行线程,新生代采用复制,清除算法;老年代标记-整理算法 优点:单线程中简单高效

请输入图片地址

ParNew:Serial收集器的多线程版本 请输入图片地址

Parallel Scavenge收集器:新生代收集器,主要目的是达到一个控制的吞吐量(cpu运行用户代码/cpu总耗时),-XX:+UseAdaptiveSizePolicy开启GC自适应调节策略(根据最大吞吐量自动调节新生代,eden,survival的大小)

Serial Old:Serial控制器老年代版本,使用标记整理算法 请输入图片地址

Parallel Old:ParallelScavenge收集器老年代版本,使用标记整理算法 请输入图片地址

CMS 是一种目的是获取最短回收停顿时间为目标,使用标记-清除算法,多线程收集器,整个收集过程分为

  1. 初始标记(仅仅标记GC Roots可达对象,速度很快,会stop the world)
  2. 并发标记(进行GCRootTracing过程,用户线程可同时工作)
  3. 重新标记(修正并发标记期间,用户程序继续运作导致标记产生变动的标记记录,一般比初试标记长,比并发标记短)
  4. 并发清除 请输入图片地址

缺点:1 CMS收集器对CPU资源敏感,因为和用户线程同时工作,导致应用程序变慢,总吞吐量会降低,默认回收线程数(cpu数量+3)/4;2 无法处理浮动垃圾,3 标记-清除造成空间碎片,会造成提前full GC

G1收集器:是一款支持并行和并发,充分利用多CPU,多核优势,缩短STW停顿时间;具有采用分代收集;空间整合;可预测停顿等特点,在Java堆分配上面划分成多个大小相等的独立区域(region),新生代和老年代不再物理隔离,通过跟踪,分析Region里垃圾的价值大小,优先回收价值大的Region

垃圾回收整个过程分为

请输入图片地址

GC日志的理解

下面是一段GC日志

33.125:[GC[DefNew:3324K->152K(3712K),0.0025925secs]3324K->152K(11904K),0.0031680 secs] 100.667:[FullGC[Tenured:0K->210K(10240K),0.0149142secs]4603K->210K(19456K),[Perm:2999K->2999K(21248K)],0.0150007secs][Times:user=0.01 sys=0.00,real=0.02 secs]

GC发生时间:【GC停顿类型–【GC发生区域(名字跟收集器有关)–GC前内存->GC后内存大小(总大小),花费时间】GC前java堆大小->GC后java堆大小,花费时间】