美文网首页
浅谈Java GC分代的原因

浅谈Java GC分代的原因

作者: 值得一看的喵 | 来源:发表于2017-10-19 15:40 被阅读0次

Java GC(garbage collec,垃圾收集,回收)

GC是对JVM中的内存进行标记和回收,Sun公司的JDK用的虚拟机都是HotSpot,对象化的实例是放在heap堆内存中的,这里讲的分代收集也是指对堆内存的回收。

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是必须的,但是老年代和永久代并不是必须的,可以通过设置参数来决定是否对类进行回收。

下面是画的一个大概的图片:

相关文章

  • 浅谈Java GC分代的原因

    Java GC(garbage collec,垃圾收集,回收) GC是对JVM中的内存进行标记和回收,Sun公司的...

  • JAVA教程:浅谈JVM的优化

    浅谈JVM的优化 前言 前面我们了解过JVM中堆的GC分代回收机制,在运行Java程序时,我们可以使用JVM的参数...

  • GCRoots

    转载Java中什么样的对象才能作为gc root,gc roots有哪些呢? java的gc为什么要分代? 所谓"...

  • JVM GC

    分代GC JVM的GC机制叫做分代GC(generational GC),把内存分为两种:新生代(Young Ge...

  • 内存分配与回收策略

    1 Minor GC+Major GC+Full GC (1)Minor GC:新生代GC。因为Java对象大多都...

  • Java常见问题分析(内存溢出、内存泄露、线程阻塞等)

    Java垃圾回收机制(GC) 1.1GC机制作用 1.2堆内存3代分布(年轻代、老年代、持久代) 1.3GC分类 ...

  • jvm之GC:

    1.jvm相关,GC: Java内存分配和回收的机制概括的说,就是:分代分配,分代回收。对象将根据存活的时间被分为...

  • Java GC机制

    GC机制的基本算法是:分代收集,这个不用赘述。下面阐述每个分代的收集方法。 年轻代: 事实上,在上一节(Java内...

  • 面试官,不要再问我“Java 垃圾收集器”了

    如果Java虚拟机中标记清除算法、标记整理算法、复制算法、分代算法这些属于GC收集算法中的方法论,那么“GC收集器...

  • 面试官,不要再问我“Java 垃圾收集器”了

    如果Java虚拟机中标记清除算法、标记整理算法、复制算法、分代算法这些属于GC收集算法中的方法论,那么“GC收集器...

网友评论

      本文标题:浅谈Java GC分代的原因

      本文链接:https://www.haomeiwen.com/subject/acouuxtx.html