• Java虚拟机垃圾收集算法


    分代收集理论

    当代的垃圾收集器,大多都遵循分代收集的理论进行设计。

    分代假说

    • 弱分代假说:绝大多数对象都是朝生夕死的。
    • 强分代假说:   熬过越多次垃圾收集过程的对象就难以消亡。

    这两个分代假说共同奠定了多个垃圾收集器的一致的设计原则:收集器应该将Java堆划分出不同的区域,然后将回收对象依据其年龄(年龄是对象熬过垃圾收过程的次数)分配到不同的区域之中存储。显而易见,如果一个区域中大多说的对象都是朝生夕死,难以熬过垃圾收集过程的话,那么应该把他们集中放在一起,每次回收时只关注如何保留少量存活而不是去标记那些大量将要被回收的对象,就能以较低的代价回收大量的空间。如果剩下的都是难以消亡的对象,那把他们集中放在一块,虚拟机便可以使用较低的频率来回收这个区域,这就同时兼顾了垃圾收集的时间开销和内存的空间有效利用。

    对于Java虚拟机的分代收集理论,设计者一般至少会把Java堆划分为新生代和老年代两个区域。顾名思义,在新生代中,每次垃圾收集时都会发现大量的对象死去,而每次存活的少量对象,将会逐步晋升到老年代中存放。

    • 部分收集(Partial GC):指目标不是完整的收集整个Java堆的垃圾收集,其中又分为:
      • 新生代收集(Minor GC/Young GC):值目标是新生代的垃圾收集。
      • 老年代收集(Major GC/Old GC):目标是老年代的垃圾收集。目前只有CMS收集器会有单独收集老年代的行为。
      • 混合收集(Mixed GC):指目标是收集整个新生代以及部分老年代的垃圾收集。目前只有G1收集器会有这种行为。
    • 整堆收集(Full GC):收集整个Java堆和方法区的垃圾收集。

    标记-清除算法

    标记-复制算法

    标记-整理算法

    经典的垃圾收集器

    •   Serial收集器
    •   ParNew收集器
    •   Parallel Scavenge收集器
    •   Serial Old收集器
    •   Parallel Old收集器
    •   CMS收集器
    •   Garbage First收集器     

    衡量垃圾收集器的三项最重要指标:内存占用,吞吐量,延迟,三者共同构成了一个不可能的三角。

    查看Java 8默认的垃圾收集器:

    ./java -XX:+PrintCommandLineFlags -version

    结论:通过-XX:+UseParallelGC可知,默认的垃圾收集器算法是:ParallelGC

    查看Java 8新生代和老年代的默认比例:

    jps - Java Virtual Machine Process Status Tool

    参考网址:https://docs.oracle.com/javase/7/docs/technotes/tools/share/jps.html

    查看Java 8新生代和Eden和Survivor比例:

    ./java -XX:+PrintFlagsInitial -version

    Eden:SurvivorRatio=8:2,其中From:To=1:1。

  • 相关阅读:
    测试网站的响应性的工具
    取出分组后的前N条数据,笔记记录。
    纯js制作页码导航
    英语单复数转换类
    用鼠标滚动缩放图片
    Plugin 'InnoDB' init function returned error.Could not start the service MySQL 解决方法
    超时时间已到。在操作完成之前超时时间已过或服务器未响应。
    数据库关系图”提示:此数据库没有有效所有者(转载)
    关于非静态类的静态成员与非静态成员的初始化顺序(zhuang)
    项目经理的“势能”培养 (转)
  • 原文地址:https://www.cnblogs.com/iuyy/p/13674192.html
Copyright © 2020-2023  润新知