JAVA GC 分代

概念:

  1. Java GC:garbage collec,垃圾收集,回收
  2. GC是对JVM中的内存进行标记和回收,Sun公司的JDK用的虚拟机都是HotSpot,对象化的实例是放在heap堆内存中的,这里讲的分代收集也是指对堆内存的回收。
  3. vm区域总体分两类,heap区和非heap区。heap区又分:Eden Space(伊甸园)、Survivor
    Space(幸存者区)、Tenured Gen(老年代-养老区)。 非heap区又分:Code Cache(代码缓存区)、Perm
    Gen(永久代)、Jvm Stack(java虚拟机栈)、Local Method Statck(本地方法栈)。
  4. 新生代 GC(Minor GC):指发生在新生代的垃圾收集动作,因为 Java 对象大多都具 备朝生夕灭的特性,所以 Minor GC
    非常频繁,一般回收速度也比较快。
  5. 老年代 GC(Major GC / Full GC):指发生在老年代的 GC,出现了 Major GC,经常 会伴随至少一次的
    Minor GC(但非绝对的,在 ParallelScavenge 收集器的收集策略里 就有直接进行 Major GC 的策略选择过程)
    。MajorGC 的速度一般会比 Minor GC 慢 10 倍以上。

分代收集原理:
GC的分代收集分为:年轻代、老年代、永久代。(方法区是被当做永久代的,不过JDK1.6后将被取消掉了)
年轻代(Young Generation)、年老代(Old Generation)、永久代(Permanent Generation,也就是方法区)
1.年轻代的GC(存放实例化的对象)
年轻代分为三个区:Eden和两个存活区(Survivor0和Survivor1),分别占内存的80%、10%、10%
使用“停止-复制(Stop-and-copy)”清理法(将Eden区和一个Survivor中仍然存活的对象拷贝到另一个Survivor中)
当Eden区满时,就执行一次MinorGC,并将剩余存活的对象都添加到Surivivor0,回收Eden中的没有存活的对象。
当Surivivor0页都满了的时候,就将仍然存活的存到Surivivor1中,回收Surivivor0中的对象
Surivivor0和Surivivor1依次去存,当两个存活区切换了几次后(HotSpot默认是15次),将仍然存活的对象复制到老年代。
2.老年代的GC(存放较大的实例化的对象和在年轻代中存活了足够久的对象)
老年代GC用的是标记-整理算法,即标记存活的对象,向一端移动,保证内存的完整性,然后将未标记的清掉。
当老年代不够用时,也会执行Major GC,即Full GC。
注意:如果永久代代存放的常量和类过大,无法全部放入永久代,也会触发永久代的GC,将一部分放入老年代。
3.永久代的GC(存放常量、类)
说明:在JDK1.6版本之后,永久代就要被取消掉了,只留下年轻代和老年代。
说明:年轻代的GC是必须的,但是老年代和永久代并不是必须的,可以通过设置参数来决定是否对类进行回收。
下面是画的一个大概的图片:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42695926/article/details/83572920