JVM 垃圾回收之Minor GC、Major GC和Full GC之间的区别

1、按照 回收区域 划分的GC 分类

JVM在进行GC时,并非每次对三个内存(新生代、老年代、方法区)区域一起回收,大部分时候回收的都是新生代。

针对Hotspot VM 的实现,它里面的GC按照回收区域分为两种大类:一种是部分收集(Partial GC),另一种是整堆收集(Full GC)

1、部分收集(Partial GC):只针对部分区域进行垃圾收集。其中又分为:
	1.1、新生代收集(Minor GC/Young GC):只针对新生代的垃圾收集。具体点的是Eden区满时触发GC。
										Survivor满不会触发Minor GC 。
	1.2、老年代收集(Major GC/Old GC):只针对 老年代的垃圾收集。
		目前,只有CMS收集器会有单独收集老年代的行为。
		注意,很多时候,Major GC 会和Full GC混淆使用,需要具体分辨是老年代的回收还是整堆回收。
	
	1.3、混合收集(Mixed GC):指目标是收集整个新生代以及部分老年代的垃圾收集。
		目前只有G1收集器会有这种行为。
		
2、整堆收集(Full GC):收集整个Java堆和方法区的垃圾收集。	

2、Minor GC、Major GC、Full GC 的简单说明

2.1、Minor GC

当年轻代(Eden区)满时就会触发 Minor GC,这里的年轻代满指的是 Eden区满。Survivor 满不会触发 Minor GC 。

从年轻代空间(主要是 Eden区)回收内存被称为 Minor GC。

发生Minor GC事件需要注意:

  1. 当 JVM 无法为一个新的对象分配空间时会触发 Minor GC,比如当 Eden 区满了。所以分配率越高,越频繁执行 Minor GC。

  2. 内存池被填满的时候,其中的内容全部会被复制,指针会从0开始跟踪空闲内存。Eden 和 Survivor 区进行了标记和复制操作,取代了经典的标记、扫描、压缩、清理操作。所以 Eden 和 Survivor 区不存在内存碎片。写指针总是停留在所使用内存池的顶部。

  3. 执行 Minor GC 操作时,不会影响到永久代。从永久代到年轻代的引用被当成 GC roots,从年轻代到永久代的引用在标记阶段被直接忽略掉。

  4. 对于大部分应用程序,Minor GC 操作时应用程序停顿导致的延迟都是可以忽略不计的。因为,大部分 Eden 区中的对象都能被认为是垃圾,永远也不会被复制到 Survivor 区或者老年代空间。如果正好相反,Eden 区大部分新生对象不符合 GC 条件,Minor GC 执行时暂停的时间将会长很多。

2.2、Major GC

CMS收集器中,当老年代满时会触发 Major GC。

目前,只有CMS收集器会有单独收集老年代的行为。其他收集器均无此行为。

针对新生代(主要指Eden区)的Minor GC 比较常见,各个收集器均支持。

通常能单独发生收集行为的只是新生代的Minor GC,所以这里“反过来”的情况只是理论上允许,实际上除了CMS收集器,其他都不存在只针对老年代的收集。(英文翻译过来的,要细品!)

2.3、Full GC

Full GC 对收集整堆(新生代、老年代)和方法区的垃圾收集。

当年老代满时会引发Full GC,Full GC将会同时回收新生代、年老代 ;
当永久代满时也会引发Full GC,会导致Class、Method元信息的卸载 。

(1)调用System.gc时,系统建议执行Full GC,但是不一定会执行 。
(2)老年代空间不足
(3)方法区空间不足
(4)通过 Minor GC 后进入老年代的空间大于老年代的可用内存
(5)由Eden区、S0(或S1)区向 S1(或S0)区复制时,对象大小大于To Space可用内存,则把该对象直接转存到老年代,且老年代的可用内存小于该对象大小 。

.

3、总结

  • Minor GC 是 清理 新生代中的Eden区,Survivor区满时不会触发
  • Major GC 是 清理 老年代 ;
  • Full GC 是 清理整个堆和方法区,包括 年轻代、老年代和方法区。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值