宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取

1.Major GC及其触发条件

Major GC清理Tenured区,用于回收老年代。当老年代满时会触发MajorGC,只有CMS收集器会有单独收集老年代的行为,其他收集器均无此行为。而针对新生代的MinorGC,各个收集器均支持。总之,单独发生收集行为的只有新生代,除了CMS收集器,都不支持单独回收老年代。

Major GC的触发条件:当老年代满时会触发MajorGC,通常至少经历过一次Minor GC,再紧接着进行Major GC。

2.Full GC及其触发条件

Full GC是针对整个新生代、老生代、元空间(metaspace,java8以上版本取代perm gen)的全局范围的GC。Full GC不等于Major GC,也不等于Minor GC+Major GC,发生Full GC需要看使用了什么垃圾收集器组合,才能解释是什么样的垃圾回收。

Full GC的触发条件如下:

  • 当创建一个大对象,Eden区域当中放不下这个大对象,会直接保存在老年代当中,如果老年代空间也不足,就会触发Full GC;
  • 当持久代当中没有足够的空间,就出触发一次Full GC;
  • 通过Minor GC后进入老年代的平均大小大于老年代的可用内存时,也会触发Full GC;
  • 调用System.gc时,系统建议执行Full GC,但是不必然执行;
  • 在新生代回收内存时,由Eden区和Survivor From区把存活的对象向Survivor To区复制时,对象大小大于Survivor To空间的可用内存,则把该对象转存到老年代(这个过程称为分配担保),且老年代的可用内存小于该对象大小。即老年代无法存放下新年代过度到老年代的对象的时候,便会触发Full GC。

延伸阅读

GC的概念以及分类

GC(Garbage Collection)即Java中的垃圾回收器。在C/C++中,释放无用变量内存空间的事情需要由程序员自己来处理。这样显然非常繁琐,如果有所遗漏,就可能造成资源浪费甚至内存泄漏。当软件系统比较复杂,程序员往往就忘记释放内存或者在不该释放的时候释放内存了。因此Java改进了这个C/C++的缺点,提出了GC的概念。

关于GC发生的分类说法不一,主要有两大类:一种是Partial GC,包括Minor GC(从新生代回收内存)、Major GC(从老年代回收内存)、Mixed GC(新生代+部分年老代,只有G1有这个模式);另一种是Full GC(全部GC),将新生代+老年代+永久代(或Metaspace)都GC。