• jvm如何知道那些对象需要回收


    1 首先的问题是:jvm如何知道那些对象需要回收 ?

    目前有两种算法

    • 引用计数法

    每个对象上都有一个引用计数,对象每被引用一次,引用计数器就+1,对象引用被释放,引用计数器-1,直到对象的引用计数为0,对象就标识可以回收

    这个可以用数据算法中的图形表示,对象A-对象B-对象C 都有引用,所以不会被回收,对象B由于没有被引用,没有路径可以达到对象B,对象B的引用计数就就是0,对象B就会被回收。

    • root搜索算法

    这种算法目前定义了几个root,也就是这几个对象是jvm虚拟机不会被回收的对象,所以这些对象引用的对象都是在使用中的对象,这些对象未使用的对象就是即将要被回收的对象。简单就是说:如果对象能够达到root,就不会被回收,如果对象不能够达到root,就会被回收。

    以下对象会被认为是root对象:

    • 被启动类(bootstrap加载器)加载的类和创建的对象
    • jvm运行时方法区类静态变量(static)引用的对象
    • jvm运行时方法去常量池引用的对象
    • jvm当前运行线程中的虚拟机栈变量表引用的对象
    • 本地方法栈中(jni)引用的对象

    java里面有四种应用关系,从强到弱分别为:

    Strong Reference(强引用) –>Weak Reference (弱引用) -> Soft Reference(软引用) – > Phantom Reference(引用)

    Strong Reference : 只有在引用对象root不可达的情况下才会标识为可回收,垃圾回收才可能进行回收

    Weak Reference :即使在root算法中 其引用的对象root可达到,但是如果jvm堆内存 不够的时候,还是会被回收。

    Soft Reference : 无论其引用的对象是否root可达,在响应内存需要时,由垃圾回收判断是否需要回收。

    Phantom Reference :在回收器确定其指示对象可另外回收之后,被加入垃圾回收队列.

  • 相关阅读:
    “TensorFlow 开发者出道计划”全攻略,玩转社区看这里!
    适合 C++ 新手学习的开源项目——在 GitHub 学编程
    【9303】平面分割
    【u114】旅行计划(12月你好)
    【u236】火炬
    【u233】单词化简
    Java Web整合开发(41) -- Forum
    1、服务器(软件)种类
    jquery trigger
    jQuery实现当按下回车键时绑定点击事件
  • 原文地址:https://www.cnblogs.com/yunger/p/5796713.html
Copyright © 2020-2023  润新知