zoukankan      html  css  js  c++  java
  • JVM学习2--GC算法,Stop-The-World现象

    一、GC算法

      ① 引用计数法:老牌垃圾回收算法,通过引用计数来回收垃圾。(Java不用)

      问题之一:很难处理循环引用:当根对象消失,实际上其他三个对象都应该被回收,但是因为环的出现,这三个对象都不会被清除。

      ② 标记清除算法

       标记清除算法是现代垃圾回收算法的思想基础。分为两个阶段:标记阶段和清除阶段。一种可行的实现是,在标记阶段,首先通过根节点,标记所有从根节点开始的可达对象。因此,为被标记的对象就是未被引用的垃圾对象 。然后,在清除阶段,清除所有未被标记的对象。

     

      ③标记压缩算法

       标记-压缩算法适用于存活对象对象较多的场合,如老年代。它在标记-清除算法的基础上做了一些优化。和标记-清除算法一样,标记-压缩算法也首先需要从根节点开始,对所有可达对象做一次标记。但之后,它并不简单的清理未被标记的对象,而是将所有的存活对象压缩到内存的一端。之后,清理边界外所有的空间。

      

    相对于标记清除的优势:清除了内存碎片,有更多连续的地址空间。

       ④ 复制算法:适用于少量对象存活的场景,如新生代。

      ⑤分区算法

      分区算法将整个堆空间划分成连续的不同小区间,如图所示。每一个小区间都独立使用,独立回收。这种算法的好处是可以控制一次回收多少个小区间。

      

      一般来说,在相同条件下,堆空间越大,一次GC时所需要的时间就越长,从而产生的停顿也越长。为了更好地控制GC产生的停顿时间,将一块大的内存区域分割成多个小块,根据目标的停顿时间,每次合理地回收若干个小区间,而不是整个堆空间,从而减少一次GC所产生的停顿。

    二、可触及性的定义

      看了刚才的算法,我们发现需要识别垃圾对象,因此给出一个可触及性的定义。

    发现我们上面一直在说根对象,这里说一下那些对象可以作为根对象:

       ① 栈中引用的对象

       ② 方法区(已合并到Metaspace)中静态成员或者常量引用的对象(全局对象)

       ③ JNI(Java Native Interface)方法栈中引用的对象

    三、Stop-The-World现象

  • 相关阅读:
    高盛、沃尔玛 题做出来还挂了的吐槽
    amazon师兄debrief
    到所有人家距离之和最短的中点 296. Best Meeting Point
    问问题没人回答的情况怎么办终于有解了
    找名人 277. Find the Celebrity
    数组生存游戏 289. Game of Life
    547. Number of Provinces 省份数量
    428. Serialize and Deserialize Nary Tree 序列化、反序列化n叉树
    alias别名简介和使用
    面试官:线程池执行过程中遇到异常会发生什么,怎样处理? Vincent
  • 原文地址:https://www.cnblogs.com/NoYone/p/8971239.html
Copyright © 2011-2022 走看看