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 是 清理整个堆和方法区,包括 年轻代、老年代和方法区。
  • 17
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: minor gc 和 full gcJava 虚拟机中的两种垃圾回收方式。 minor gc 是指对年轻代进行垃圾回收,年轻代中的对象一般存活时间较短,因此垃圾回收频率较高。minor gc 通常会暂停应用程序的执行,直到垃圾回收完成。 full gc 是指对整个堆进行垃圾回收,包括年轻代和老年代。老年代中的对象一般存活时间较长,因此垃圾回收频率较低。full gc 会暂停应用程序的执行,直到垃圾回收完成,因此会对应用程序的性能产生较大影响。 因此,minor gc 和 full gc区别在于垃圾回收的范围和频率,以及对应用程序性能的影响程度。 ### 回答2: Minor GC(Young GC)和Full GC(Major GC)是Java虚拟机(JVM)中垃圾收集的两个重要阶段。 Minor GC主要负责清理年轻代(Young Generation)的垃圾对象,年轻代又分为Eden区、Survivor 0区和Survivor 1区。当Eden区满时,触发Minor GC。在这个过程中,存活的对象会被复制到Survivor区,然后进行垃圾回收Minor GC是一个短暂的过程,通常不会引起长时间的应用暂停。因为大部分对象在年轻代很快就被回收,所以Minor GC的频率比较高。 Full GC则是对整个堆内存进行垃圾回收。它主要清理老年代(Old Generation)和永久代(Perm Generation)中的垃圾对象。Old Generation存放生命周期较长的对象,而Perm Generation存放类信息、常量等。Full GC的频率较低,一般在触发条件满足时才会发生。Full GC执行时间较长,会导致应用的停顿,并且会造成较大开销。 总结而言,Minor GC主要针对年轻代的回收,频率较高但耗时较短,而Full GC则是对整个堆内存进行垃圾回收,频率较低但耗时较长。Minor GC的目标是快速地回收生命周期短的对象,而Full GC则是为了清理老年代和永久代中的垃圾对象以防止内存不足。了解Minor GC和Full GC区别有助于我们优化JVM垃圾回收策略,提高应用的性能和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值