广西河池住房和城乡建设厅网站,外贸网站如何建设,网页制作素材模板图片,天津武清做网站版权声明#xff1a;本文为博主原创文章#xff0c;转载请注明出处#xff0c;欢迎交流学习#xff01; 在堆内存中存放着Java程序中几乎所有的对象实例#xff0c;堆内存的容量是有限的#xff0c;Java虚拟机会对堆内存进行管理#xff0c;回收已经“死去”的对象…版权声明本文为博主原创文章转载请注明出处欢迎交流学习 在堆内存中存放着Java程序中几乎所有的对象实例堆内存的容量是有限的Java虚拟机会对堆内存进行管理回收已经“死去”的对象即不可能再被任何途径使用的对象释放内存。垃圾收集器在对堆内存进行回收前首先要做的第一件事就是确定这些对象中哪些还存活着哪些已经死去。Java虚拟机是如何判断对象是否可以被回收的呢 引用计数算法 引用计数算法的原理是这样的给对象添加一个引用计数器每当有一个地方引用它时计数器值就加1当引用失效时计数器值就减1在任何时刻计数器的值为0的对象就是不可能再被使用的也就是可被回收的对象。 引用计数算法的效率很高但是主流的JVM并没有选用这种算法来判定可回收对象因为它有一个致命的缺陷那就是它无法解决对象之间相互循环引用的的问题对于循环引用的对象它无法进行回收。 假设有这样一段代码 public class Object {public Object instance;public static void main(String[] args) {// 1Object objectA new Object();Object objectB new Object();// 2objectA.instance objectB;objectB.instance objectA;// 3objectA null;objectB null;} 程序启动后objectA和objectB两个对象被创建并在堆中分配内存这两个对象都相互持有对方的引用除此之外这两个对象再无任何其他引用实际上这两个对象已经不可能再被访问引用被置空无法访问但是它们因为相互引用着对方导致它们的引用计数器都不为0于是引用计数算法无法通知GC收集器回收它们。 实际上当第1步执行时两个对象的引用计数器值都为1当第2步执行时两个对象的引用计数器都为2当第3步执行时二者都清为空值引用计数器值都变为1。根据引用计数算法的思想值不为0的对象被认为是存活的不会被回收而事实上这两个对象已经不可能再被访问了应该被回收。 可达性分析算法 在主流的JVM实现中都是通过可达性分析算法来判定对象是否存活的。可达性分析算法的基本思想是通过一系列被称为GC Roots的对象作为起始点从这些节点开始向下搜索搜索走过的路径称为引用链当一个对象到GC Roots对象没有任何引用链相连就认为GC Roots到这个对象是不可达的判定此对象为不可用对象可以被回收。 在上图中objectA、objectB、objectC是可达的不会被回收objectD、objectE虽然有关联但是它们到GC Roots是不可达的所以它们将会被判定为是可回收的对象。 在Java中可作为GC Roots的对象包括下面几种 1、虚拟机栈中引用的对象 2、方法区中类静态属性引用的对象 3、方法区中常量引用的对象 4、本地方法栈中Native方法引用的对象。 以上探讨了判定对象是否可回收的两种算法判定对象是否可回收只是垃圾回收的第一步接下来还要解决何时回收以及如何回收的问题在后面的文章中我们来探讨这些问题。 转载于:https://www.cnblogs.com/fangfuhai/p/7197750.html