首先记一下堆空间的内存结构
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可用内存,再转移到老年代时,老年代可用内存还是小于该新的对象大小时
评论区