zoukankan      html  css  js  c++  java
  • [转]Java GC的原理

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

    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是必须的,但是老年代和永久代并不是必须的,可以通过设置参数来决定是否对类进行回收
     
    下面是画的一个大概的图片。
     
     
  • 相关阅读:
    POJ 3468 A Simple Problem with Integers
    BZOJ 4430 Guessing Camels
    POJ 2309 BST
    POJ 1990 MooFest
    cf 822B Crossword solving
    cf B. Black Square
    cf 828 A. Restaurant Tables
    Codefroces 822C Hacker, pack your bags!
    [HDU 2255] 奔小康赚大钱
    [BZOJ 1735] Muddy Fields
  • 原文地址:https://www.cnblogs.com/atai/p/8243246.html
Copyright © 2011-2022 走看看