要应用GC_ROOT算法,判定某个对象是否会被回收,关键是要确定root。确定root之后,你就可以根据代码绘制可达链,从而就可以进行分析了,分析哪些对象会被泄漏,哪些对象会被回收,如果GC执行的时候。
可以作为root的对象:
1.类中的静态变量,当它持有一个指向一个对象的引用时,它就作为root
2.活动着的线程,可以作为root
3.一个Java方法的参数或者该方法中的局部变量,这两种对象可以作为root
4.JNI方法中的局部变量或者参数,这两种对象可以作为root
其它。
其中:第1种是类的类型信息,加载在方法区中;第3种,是存放在虚拟机栈的栈帧中,一个线程调用一个java方法,java虚拟机就会使用一个栈帧保存该方法的调用状态,该栈帧入栈到该线程所对应的虚拟机栈中;第4种,是存放在一个线程的本地栈中。
例子:下述的Something和Apple都可以作为root对象。
public AClass{
public static Something;
public static final Apple;
''''''
}
Java方法的参数和方法中的局部变量,可以作为root.
public Aclass{
public void doSomething(Object A)
{
ObjectB b = new ObjectB;
}
}
//某个线程执行该方法时,参数A可以作为root;
// 局部变量b,也可以作为参数。
-------------------------------------------------我是分割线--------------------------------------------------------------------------------------------
//参考资料:
http://www.yourkit.com/docs/80/help/gc_roots.jsp
http://www.cnblogs.com/zuoxiaolong/p/jvm3.html
GC roots
The so-called GC (Garbage Collector) roots are objects special for garbage collector. Garbage collector collects those objects that are not GC roots and are not accessible by references from GC roots.
There are several kinds of GC roots. One object can belong to more than one kind of root. The root kinds are:
java.lang.Class
happen to be roots of other kind(s).If an object is a root, it is specially marked in all views showing individual objects. For example, the following picture shows a fragment of paths view:
手机扫一扫
移动阅读更方便
你可能感兴趣的文章