引用计数算法:

 

给对象添加一个引用计数器,每当有地方应用时,计数器值就加一,当引用失效时,程序计数器就减一,只要引用计数器的值为零时,就表示对象不可能再被引用,例如微软的 component object model技术就使用了这种用法。然而java中并没使用这种方式,因为这种方式很难解决对象中的循环引用问题。

例如对象A和对象B,其中对象A中有一个属性,叫instance,且A.instance=B,相反B中也有一个属性叫instance,且B.instance=A,这两个对象互相引用着对方,导致他们的引用计数器都不为零,然而这两个对象估计再也不可能被使用,而无法通知GC回收它们

 

 

根搜索算法:

java,c,lisp都使用根搜索算法判断对象是否存活?通过一系列名为GCroot 的对象作为起点,从这些节点开始向下搜索,搜素走过的路径为引用链,当一个对象到GCroot没有任何引用链的时候,证明这些对象就是不可用的,即可判断其为可回收的。

 

可以作为GCroot的对象包括:

1、虚拟 机栈( 帧栈中的本地变量表)中的引用对象

2、方法区中的类静态属性引用对象

3、方法区中的常量引用的对象

4、本地方法栈中的JNI即时一般的native应用对象


 

     1. Histogram可以列出内存中的对象,对象的个数以及大小。

     2. Dominator Tree可以列出那个线程,以及线程下面的那些对象占用的空间。

     3.Top consumers通过图形列出最大的object。

     4.Leak Suspects通过MA自动分析泄漏的原因。