• JVM 学习笔记(二)


    JVM 堆中几乎存放着java中所有的对象实例,在在垃圾回收前先要判断对象是否已死,这里对对象的判断主要有:

    1.  引用计数法

         给对象中添加一个引用计数器,每当有一个地方引用他时,计数器就加1;当引用失效时,计数器就减1。任何时间计数器为0时,对象就不可能在次使用。

    2.  根搜索法

        通过一系列的名为GC Roots 作为起点,从这些节点开始向下搜索,搜索走过的路径成为引用链(Reference Chain), 当一个对象到GC Roots 没有任何引用链时,则说明此对象时不可到达的。

      可以作为GC Roots的对象包括:

      A. 虚拟机栈中的引用对象

      B. 方法区中的常量引用的对象

      C. 方法区中类的静态属性引用的对象

      D. 本地方法栈中JNI(即:Native方法)的引用的对象

    垃圾回收算法

    1. 标记-清除算法

      标记-清除是最为集成的的算法,主要分为标记、清除两个阶段。首先标记出所有需要回收的对象,在标记完成后,统一进行回收。(如下图)

      缺点: 一是效率不高;二是空间碎片多(如果需要一整颗空闲内存,则需要触发一次碎片整理)

    2.  复制算法

    为提高时间方面效率,复制算法将内存空间安装容量分成大小相等的两块,每次只使用其中一块,当这一刻内存用完时,就将还存活的对象复制到另一块上面,然后再把已经使用过的内存空间一次性清理掉。 如下图:

     缺点: 空间利用率非常低,为原内存的一半。

    3.  标记-整理算法

         由于复制算法在对象存放率较高时,就要执行较多的复制(效率一样变低),更为重要的是不想浪费50%的空间,就需要有格外的空间分配担保,以对应极端情况下所有对象都有100%的存活。(如下图)

  • 相关阅读:
    beginAppearanceTransition
    runtime基础
    UIStoryboard跳转界面
    xcode所有版本下载地址
    UIImage添加滤镜
    苹果copy等其他的英文改成中文
    UITextField输入中文
    keyboard添加down按钮
    2020-07-08:mysql只有一个表a,什么情况下会造成死锁,解决办法是什么?
    2020-07-05:tcp和udp的区别和应用场景。如何实现断点续传?
  • 原文地址:https://www.cnblogs.com/dragonflyyi/p/3714107.html
Copyright © 2020-2023  润新知