Java内存管理

在介绍三种垃圾收集算法之前,先说下三种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信息输出到单独的文件中.
原文地址:https://www.cnblogs.com/fxust/p/7289970.html