什么情况下会发生内存泄漏?
长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄漏,尽管短生命周期对象已经不再需要,但是因为长生命周期持有它的引用而导致不能被回收,这就是Java中内存泄漏的发生场景。
1. 引用计数法
定义:每个对象有一个引用计数器,当对象被引用一次计数器加1,引用失效一次减1.。当计数器为0时,对象可被GC回收。
问题:当两个对象相互引用时,可能引发内存泄漏。
public class GcObject{ public Object instance = null; } public class Test{ public static void main(String[] args){ Gcobject obj1 = new GcObject();//step1 Gcobject obj2 = new GcObject();//step2 obj1.instance = obj2;//step3 obj2.instance = obj1;//step4 obj1 = null;//step5 obj2 = null;//step6 } }
2. 根搜索算法(可达性算法)
算法核心:是从GC Roots对象作为起始点,利用图论知识,图中可达对象便是存活对象,不可达对象(没有任何GCroot引用链相连)便是垃圾内存。
GCroot 1. 方法区中的静态引用。2 JVM栈中的引用。3.本地方法栈中的引用。