垃圾回收算法:
1、引用计数法
每个对象有一个引用属性,新增一个引用时加1,引用释放时减1,计数为0得时候可以回收。
但这种计算方法无法解决循环引用的问题。
2、可达性分析算法
(1)从GCRoot开始向下搜索,搜索所走过的路径被称作引用链,当一个对象到GCRoot没有任何引用链相连时,则证明此对象是不可用的,那么虚拟机就可以判定回收。
(2)GCRoot包含:
虚拟机栈中引用的对象
方法区中静态属性引用的对象
方法区中常量引用的对象
本地方法栈中引用的对象
不同的引用类型:
(1)强引用:通过关键字new的对象就是强引用对象,强引用对象任何时候都不会被回收,即使OOM也不会被回收。
(2)软引用:使用java.lang.ref.SoftReference引用,当JVM堆空间不足时,就会被回收。
(3)弱引用:使用java.lang.ref.WeakReference引用,在GC发现弱引用的时候,就会被回收。
(4)虚引用:使用PhantomReference引用,随时可能被回收。