侧边栏壁纸
博主头像
suringYu

走走停停

  • 累计撰写 50 篇文章
  • 累计创建 18 个标签
  • 累计收到 3 条评论

目 录CONTENT

文章目录

Minor GC、Maior GC与Full GC

suringYu
2023-11-15 / 0 评论 / 0 点赞 / 92 阅读 / 783 字

首先记一下堆空间的内存结构

结构

JVM在进行GC(内存清理回收)的主要三个内存空间,新生代,永久代(老年代),方法区进行GC。每次GC时候并非是每次都这三个空间一起回收,大部分回收的时候是在新生代。

GC方式

针对于,hotspot vm的实现,gc按照回收区域分为两大类:部分收集Partial GC,不是完整收集整个java堆的垃圾收集,另一种是整堆收集Full GC****

  • 部分收集(Partial GC

    不是完整收集整个java堆的垃圾收集,又分为

    • 新生代收集(Eden GC 伊甸园区 GC ,也可认为是Young GC)- 只是新生代区的GC
    • 老年代收集(Major GC/Old GC)- 只是老年代收集
      • 目前只有CMS GC 会有单独收集老年代的行为
      • 很多时候Major GC 和Full GC 会混在一起使用,需要区分是哪一个使用
    • 混合收集 (Mixed GC),收集整个新生代和部分老年代的垃圾收集- 目前只有 G1 GC
  • 整堆收集(Full GC

    收集整个java堆和方法区的垃圾收集

  • Eden GC 伊甸园区 GC ,也可认为是**Young GC,**这个只是在新生代上进行的

    • Minor GC
  • 在老年代区进行GC的

    • Major GC或者Full GC

触发方式

Minor GC/Young GC

  • 当年轻代空间不足,会触发Minor GC,这里的年轻代指Eden伊利园区满了,Survivor 区满不会触发gc,只会清理年轻代的空间
  • 会引发STW- stop ,暂停其他用户的线程,等待垃圾回收结束,用户线程才会恢复运行。

Major GC/Old GC

  • 指发生在老年代的GC,对象在老年代中被回收时,Major GC或者Full GC发生了
  • 出现了Major GC,至少出现了一次Minor GC/Young GC,但不是绝对的
    • 当老年代空间不足的时候,会先尝试使用Minor GC/Young GC,清理出空间,如果在此之后,空间还是不足以本次使用,将触发Major GC/Old GC
  • Major GC/Old GC会比Minor GC/Young GC更慢,一般会慢10倍以上,STW时间更长
  • 如果在Major GC/Old GC后,内存还是不足,将报错OOM

Full GC

  • 调用System.gc()
  • 老年代空间不足
  • 方法区空间不足
  • Minor GC/Young GC后进入老年代的大小,大于老年代的可用内存
  • Minor GC/Young GC后由Eden区和s0向s1复制时,新的对象大小大于s2可用内存,再转移到老年代时,老年代可用内存还是小于该新的对象大小时
0

评论区