zoukankan      html  css  js  c++  java
  • 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 :在回收器确定其指示对象可另外回收之后,被加入垃圾回收队列.

  • 相关阅读:
    00:Java简单了解
    QQ空间相册照片批量导出
    Git基本操作
    【有钱的大佬看过来】Java开发学习大纲
    默认端口号走一波
    获取“今日头条”西瓜视频
    CentOS 下源码安装LAMP环境
    书写是为了更好的思考
    U盘安装Ubuntu 14.04 LTS正式版 出现如下的提示,不能继续,如何操作?
    U盘安装Ubuntu 14.04 LTS正式版
  • 原文地址:https://www.cnblogs.com/yunger/p/5796713.html
Copyright © 2011-2022 走看看