zoukankan      html  css  js  c++  java
  • 判断一个对象是否可以被回收

    https://www.cnblogs.com/jxxblogs/p/12208113.html

    一、引用计数算法:

      判断对象的引用数量:

        通过判断对象的引用数量来决定对象是否可以被回收;

        每个对象实例都有一个引用计数器,被引用则+1,完成引用则-1;

        任何引用计数为0的对象实例可以被当作垃圾收集;

      优缺点:

        优点:执行效率高,程序执行受影响较小;

        缺点:无法检测出循环引用的情况,导致内存泄漏;

    二、可达性分析算法:

    通过判断对象的引用链是否可达来决定对象是否可以被回收;

    jvm要做垃圾回收时,首先要判断一个对象是否还有可能被使用。那么如何判断一个对象是否还有可能被用到?

    如果我们的程序无法再引用到该对象,那么这个对象就肯定可以被回收,这个状态称为不可达。当对象不可达,该对象就可以作为回收对象被垃圾回收器回收。

    那么这个可达还是不可达如何判断呢?

    答案就是GC roots ,也就是根对象,如果从一个对象没有到达根对象的路径,或者说从根对象开始无法引用到该对象,该对象就是不可达的。

    以下三类对象在jvm中作为GC roots,来判断一个对象是否可以被回收 
    (通常来说我们只要知道虚拟机栈和静态引用就够了)

    • 虚拟机栈(JVM stack)中引用的对象(准确的说是虚拟机栈中的栈帧(frames)) 
      我们知道,每个方法执行的时候,jvm都会创建一个相应的栈帧(栈帧中包括操作数栈、局部变量表、运行时常量池的引用),栈帧中包含这在方法内部使用的所有对象的引用(当然还有其他的基本类型数据),当方法执行完后,该栈帧会从虚拟机栈中弹出,这样一来,临时创建的对象的引用也就不存在了,或者说没有任何gc roots指向这些临时对象,这些对象在下一次GC时便会被回收掉

    • 方法区中类静态属性引用的对象 
      静态属性是该类型(class)的属性,不单独属于任何实例,因此该属性自然会作为gc roots。只要这个class存在,该引用指向的对象也会一直存在。class 也是会被回收的,在面后说明

    • 本地方法栈(Native Stack)引用的对象

    一个class要被回收准确的说应该是卸载,必须同时满足以下三个条件

        • 堆中不存在该类的任何实例
        • 加载该类的classloader已经被回收
        • 该类的java.lang.Class对象没有在任何地方被引用,也就是说无法通过反射再带访问该类的信息
  • 相关阅读:
    javascript 备忘 细节 相关
    内存泄漏
    css相关 细节 优化 备忘
    nodeType
    事件冒泡 模型
    两个感叹号作用
    非冒泡事件
    DOM 对象
    Quartz2D 之 绘制文本
    Voilin 与 乐谱
  • 原文地址:https://www.cnblogs.com/brxHqs/p/13589304.html
Copyright © 2011-2022 走看看