游戏艺术活动中心 - 最新网游活动与资讯

【JVM 九】MinorGC、MajorGC与FullGC的对比

前言: 我们所说的jvm调优就是希望垃圾回收次数少一点。当触发GC的时候,就会引发STW(stop the world),暂停当前线程的执行,MinorGC执行的时间较短,MajorGC和FullGC产生的暂停时间要比MinorGC暂停时间要长的多,重点就是针对MajorGC和FullGC进行调优。

1、 概述 JVM在进行GC时,并非每次都对(新生代、老年代、方法区)一起回收的,大部分时候回收的都是指新生代。针对Hotspot VM的实现,它里面的GC按照回收区域又分为两大种类型:一种是部分收集(Partial GC),一种是整堆收集(FullGC)

部分收集:不是完整收集整个Java堆的垃圾收集。其中又分为:

新生代收集(MinorGC/YoungGC):只是新生代(Eden,s0,s1)的垃圾收集

老年代收集(MajorGC/OldGC):只是老年代的圾收集。

目前,只有CMS GC会有单独收集老年代的行为。

注意,很多时候Major GC会和Full GC混淆使用,需要具体分辨是老年代回收还是整堆回收。

混合收集(MixedGC):收集整个新生代以及部分老年代的垃圾收集。目前,只有G1 GC会有这种行为。 整堆收集(FullGC):收集整个java堆和方法区的垃圾收集。 2、年轻代GC(Minor GC)触发机制 当年轻代空间不足时,就会触发Minor GC,这里的年轻代满指的是Eden代满,Survivor满不会引发GC。(每次MinorGC会清理年轻代的内存。) 因为Java对象大多都具备 朝生夕灭 的特性,所以Minor GC非常频繁,一般回收速度也比较快。这一定义既清晰又易于理解。 Minor GC会引发STW(stop the word),暂停其它用户的线程,等垃圾回收结束,用户线程才恢复运行。 【JVM 九】MinorGC、MajorGC与FullGC的对比 3、 Major GC 指发生在老年代的GC,对象从老年代消失时,我们说 “Major GC” 或 “Full GC” 发生了。 出现了Major GC,经常会伴随至少一次的Minor GC(但非绝对的,在Paralle1

Scavenge收集器的收集策略里就有直接进行Major GC的策略选择过程)。

也就是在老年代空间不足时,会先尝试触发Minor GC。如果之后空间还不足,则触发Major GC。 Major GC的速度一般会比Minor GC慢10倍以上,STW的时间更长。 如果Major GC后,内存还不足,就报OOM了。 4、 Full GC 触发Full GC执行的情况有如下五种:

(1)调用System.gc()时,系统建议执行Full GC,但是不必然执行。

(2)老年代空间不足。

(3)方法区空间不足。

(4)通过Minor GC后进入老年代的平均大小大于老年代的可用内存。

(5)由Eden区、survivor space0(From Space)区向survivor space1(To Space)区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小。

说明:Full GC 是开发或调优中尽量要避免的。这样暂时时间会短一些

出现OOM一定会出现Full GC

GC举例与日志分析 vm options:

-Xmx9m -Xms9m -XX:+PrintGCDetails

public static void main(String[] args) {

List list=new ArrayList<>();

String a="atGuigu.com";

while(true){

list.add(a);

a=a+a;

}

}

结果:

【JVM 九】MinorGC、MajorGC与FullGC的对比 分析:

GC表示的minorGC

PSYoungGen:2048K【GC之前新生代垃圾大小】->504K【GC之后的新生代垃圾大小】(2560K【新生代总空间的大小】) 2048K【堆空间总的垃圾大小】->736K【堆空间GC后总的垃圾大小】(9728K【堆空间总大小,我们上面设置的9M】)

2026-01-04 14:31:27
友情链接