垃圾回收
一、如何判断对象可以回收
1.1引用计数法(Python)
定义:当引用数为0时进行回收
问题:无法解决循环引用
1.2可达性分析算法(Java)
(堆空间分析器)
GC root原理:通过对枚举GCroot对象做引用可达性分析,即从GC root对象开始,向下搜索,形成的路径称之为引用链。
如果一个对象到GC roots对象没有任何引用,没有形成引用链,那么该对象等待GC回收。
GC Root对象有哪些
虚拟机栈 -----栈帧中的本地变量表中引用的对象 ,如正在运行方法所使用的参数、局部变量、临时变量等
本地方法栈 -----即一般说的Native方法引用的对象
方法区----- 类静态属性引用的对象
方法区----- 常量引用的对象,如字符串常量池(StringTable)里的引用
以及Java虚拟机内部的引用,如基本数据类型对应的Class对象、常驻的异常对象(如:NullPointException、OutOfMermoryError)等,还有系统类加载器;
被同步锁(synchronized关键字)持有的对象;
反映虚拟机内部情况的JMXBean、HVMTI中注册的回调、本地代码缓存等。
1.3四种引用
强软弱虚,以及终结器引用(实线为强引用)
强引用(Strong Reference)是最常见的引用类型,它指向一个对象,只要这个引用存在,就不会被垃圾回收器回收。
软引用(Soft Reference)是一种较弱的引用类型,它指向一个对象,但当内存空间不足时,这个对象可能会被垃圾回收器回收。软引用可以用来实现缓存功能。
弱引用(Weak Reference)是一种更弱的引用类型,它指向一个对象,但只要这个对象没有被其他强或软引用指向,就会被垃圾回收器回收。弱引用可以用来解决循环依赖问题。
虚引用(Phantom Reference)是一种最弱的引用类型,它指向一个对象,但不能通过它访问到这个对象。虚引用只能配合ReferenceQueue使用,当这个对象被垃圾回收器回收时,虚引用会被放入ReferenceQueue中。虚引用可以在对象被销毁时做一些清理工作。