• [转]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是必须的,但是老年代和永久代并不是必须的,可以通过设置参数来决定是否对类进行回收
     
    下面是画的一个大概的图片。
     
     
  • 相关阅读:
    《哈佛商业评论》2018正刊12期与增刊25期的点评
    《财经》2018年共30+1期的点评与摘抄
    4星|《人人都在说谎》:社会科学方面有趣的数据分析方法与结论
    3星|侯世达《我是个怪圈》:关于人类意识的各种哲学思辨
    虚拟机 SUSE Linux Enterprise Server 12 SP2 64
    虚拟机 CentOS7 64
    虚拟机 ubuntu 16.04
    虚拟机 windows xp sp3 原版
    C#实现控制Windows系统关机、重启和注销的方法
    日期时间设置 "2018-05-04T16:36:23.6341371+08:00" 格式
  • 原文地址:https://www.cnblogs.com/atai/p/8243246.html
Copyright © 2020-2023  润新知