在介绍三种垃圾收集算法之前,先说下三种GC的区别:
MinorGC:年轻代空间回收
MajorGC:老年代空间回收
FullGC:整个堆空间回收
垃圾收集算法分类
1.Serial Collector
JVM在client模式下的默认GC方式.通过JVM配置参数:-XX:+UseSerialGC指定GC使用该收集算法.我们创建的所有对象都在Eden区创建,如果Eden区空间不足就会触发MinorGC.不过每次MinorGC之前会查看之前每次晋升对象大小是否超过了Old区的剩余空间,如果大于则触发一次FullGC,如果小于,则要看HandlePromotionFailure参数(-XX:-HandlePromotionFailure)的值,如果为true,仅触发MinorGC,否则再触发一次FullGC.
2.Parallel Collector
Parallel GC根据Minor GC和Full GC的不同,分为三种.
1)ParNewGC
通过-XX:UseParNewGC参数指定,它的对象分配和回收策略与Serial Collector类似,只是回收的线程是多线程并行回收.
2)ParallelGC
在Server下默认的GC方式,通过-XX:UseParallelGC参数来强制指定,并行回收的线程数可以通过-XX:ParallelGCThreads来制定,这个值有个计算公式,如果CPU和核数小于8,线程数和核数一样,如果大于8,值为 3+(cpu core*5)/8
3)ParallelOldGC
通过-XX:UseParallelOldGC参数来强制指定,与上面的类似,并行回收的线程数可以通过-XX:ParallelGCThreads来制定,这个值有个计算公式,如果CPU和核数小于8,线程数和核数一样,如果大于8,值为 3+(cpu core*5)/8
3.CMS Collector
可以通过-XX:UseConcMarkSweepGC来指定,并发的线程数默认为4(并行GC线程数+3),也可通过ParallelCMSThreads来指定.CMS GC是基于MinorGC和FullGC之间的一种GC,它的触发规则是检查Old区或者Perm区的使用率,当达到一定比例时就触发CMS GC,触发时会回收Old区的内存空间.触发CMSGC回收的只是Old区和Perm区的垃圾对象,在回收时和之前的MinorGC,FullGC基本没有关系.
触发FullGC的两种情况:
A.Eden分配失败,触发MinorGC后分配到To Space,To Space不够再分配到Old区,Old区不够则触发Full GC.
B.当CMS GC正在进行向Old区申请内存失败则会直接触发Full GC.
4.组合使用者三种GC
5.三种GC的优缺点
6.GC日志输出参数
- -verbose:gc,可以辅助输出一些详细的GC信息.
- -XX:+PrintGCDetails,输出GC的详细信息.
- -XX:+PrintGCApplicationStoppedTime,输出GC造成应用程序暂停的时间.
- -XX:+PrintGCDateStamps,GC发生的时间信息.
- -XX:+PrintHeapAtGC,在GC前后输出堆中各个区域的大小.
- -Xloggc:[file],将GC信息输出到单独的文件中.