- 垃圾 ——运行程序中没有任何指针指向的对象
- GC——垃圾回收
- 回收关心区域——方法区(元空间)、堆(重点)
引用计数算法
- 对每一个对象保存一个整型的引用计数器属性,用于记录对象被引用的情况。引用增加计数起加一,引用失效计数器失效。当对象引用树为0时,则表示对象可回收。
- 优点:实现简单,判定效率高,回收没有延迟性。
- 缺点:
- 需要单独的计数器,增加了存储空间开销
- 每次引用都需要更新计数器,增加了时间开销
- 致命问题:无法处理循环引用的问题,导致内存泄露问题
循环引用问题—— 对象 A 和 B 互相引用,但是A、B没有其他任何对象引用。导致其他回收不了。
内存泄露——无用对象却无法回收导致内存泄露
可达性分析--java中使用的
- 以更对象集合(GC Roots)为起始点,搜索根对象所连接的目标对象是否可达。搜索的路径称为引用链,对象没有任何引用链相连则是不可达,可标记为了垃圾对象。
- 解决循环引用问题
- GC Roots包括元素
- 虚拟机栈中引用的对象:各个线程被调用的方法中使用到的参数、局部变量等
- 本地方法中引用的对象
- 方法区中类静态属性引用的对象:java类的引用类型静态变量
- 方法区中常量引用对象:字符串常量池中的引用
- 被同步锁synchronize持有的对象
- java虚拟机内部的引用:基本数据类型对应的class对象,系统类加载器
- 反映java虚拟机内部情况JMXBean、JVMTI中注册的问题、本地代码缓存等
对象的finalization机制
- 机制允许开发人员在对象被销毁之前进行自动定义处理逻辑。
- 回收对象前 总会先调用对象的finalize()方法。
- finalize()方法允许在子类中被重写,用于在对象被回收时进行资源释放。
- 不要主动调用finalize()
- 可能导致对象的复活
- 方式执行的时间没有保障,由GC线程控制,不发生GC则finalize()方法将没有机会执行
- 糟糕的finalize()会影响GC 的性能
finalize()方法影响对象状态的三种状态
- 可触及的 -- GC Roots 可到达的
- 可复活的 -- GC Roots 不可到达,但对象可能在finaliza()方法中复活,finalize()方法只能执行一次 所以对象只能复活一次。
- 不可触及的 -- finaliza()方法中没有符合