在对象中添加一个引用计数器,每当一个地方引用它,计数器就加一;当引用失效时,计数器就减一;任何时刻计数器为零的对象就是不可能在被使用的。
客观的说,引用计数算法虽然占用了一些额外的内存空间来计数,原理简单,效率也很高,但是在Java领域,至少主流的Java虚拟机里面都没有选用引用计数法来进行内存管理,主要原因是,这个算法有很多例外要处理,比如对象之间相互循环引用解决起来就很麻烦。
import org.junit.Test;
public class ReferenceCountIngGC {
public Object instance = null;
private static final int _1MB = 1024*1024;
private byte[] bigSize = new byte[2*_1MB];
public static void teseGC(){
ReferenceCountIngGC A = new ReferenceCountIngGC();
ReferenceCountIngGC B = new ReferenceCountIngGC();
A.instance = B;
B.instance = A;
A = null;
B = null;
//假设在这行发生GC,A和B是否能被回收
System.gc();
}
public static void main(String[] args) {
teseGC();
}
}
由上述GC日志可知,里面包含了“880K->645K(249344K)”表示“GC前java堆已使用容量”–>“GC后java堆的已使用容量(java堆总容量”,这意味着Java虚拟机并没有因为这两个对象互相应用就放弃回收它们,这也说明了Java虚拟机并不是通过引用计数算法来判断对象是否存活的。
**基本思路:**通过一系列称为“GC Root”的根对象作为起始节点集,从这些节点开始根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”,如果某个对象到GC Roots间没有任何引用链相连,或者图论的话来说就是从GC Roots到这个对象不可达时,则证明这个对象是不可能再被使用的。算法具体过程如下图所示
在Java技术体系里面,固定可以作为GC Roots的对象包括以下几种
在JDK1.2版之后,java对引用的概念进行了扩充,将引用分为了强引用(Strongly Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference,引用强度逐次减弱。
即使在可达性分析算法中判定为不可达对象,也不是“非死不可”的,这时候他们暂时还处于“缓刑”阶段,要真正宣告一个对象死亡,至少要经历两次标记过程:如果对即使在可达性分析算法中判定为不可达的对象,也不是“非死不可”的,这时候它们象在进行可达性分析后发现没有与 GC Roots 相连接的引用链,那它将会被第一次标记,随后进行一次筛选,筛选的条件是此对象是否有必要执行 finalize()方法。假如对象没有覆盖finalize()方法,或者 finalize()方法已经被虚拟机调用过,那么虚拟机将这两种情况都视为“没有必要执行”。
如果这个对象被判定为确有必要执行 finalize()方法,那么该对象将会被放置在一个名为 F-Queue 的队列之中,并在稍后由一条由虚拟机自动建立的、低调度优先级的 Finalizer线程去执行它们的 finalize()方法。这里所说的“执行”是指虚拟机会触发这个方法开始运行,但并不承诺一定会等待它运行结束。这样做的原因是,如果某个对象的 finalize0)方法执行缓慢,或者更极端地发生了死循环,将很可能导致 F-Queue 队列中的其他对象永久
处于等待,甚至导致整个内存回收子系统的崩溃。finalize()方法是对象逃脱死亡命运的最后一次机会,稍后收集器将对 F-Queue 中的对象进行第二次小规模的标记,如果对象要在finalize()中成功拯救自己——只要重新与引用链上的任何一个对象建立关联即可。
方法区的垃圾收集主要回收两部分内容:1.废弃的常量。2.不在使用的类型
不在被使用的类条件:
刚开始接触PHP开发,搭建开发环境是第一步,网上下载PhpStorm和PhpStudy软件,怎...
1 CurrentFolder 参数,可以在网站中不同目录新建文件夹,参数使用 ../../来篡改...
pChart是一个开源的图表生成库,主要涉及3个Class: pChart.class , pData.class...
追本溯源,从使用开始 首先看一下我们通常是如何使用微软自带的认证,一般在Star...
JWT认证简单介绍 关于Jwt的介绍网上很多,此处不在赘述,我们主要看看jwt的结构...
PostgreSQL(也称postgres)是一款强大的开源对象关系数据库系统(ORDBMS), 历经30...
1、新建DLL 打开VB6--文件--新建工程--选择ActiveX DLL--确定 2、将默认工程、类...
想了解更多内容,请访问: 51CTO和华为官方战略合作共建的鸿蒙技术社区 https://...
XHTML的标签有许多:div、ul、li、dl、dt、dd、h1~h6、p、a、addressa、span、 s...
5.迷宫 下图给出了一个迷宫的平面图其中标记为1 的为障碍标记为0 的为可 以通行...