对象成为垃圾的条件
1.对于非线程对象来说 当所有的活动线程都不可能访问到这对象时,变成垃圾
2.对于线程对象来说 除了上一条之外,还要求吃线程本身已经死亡或者还处于新建状态,才是垃圾,才能被回收
千万不要片面的认为“没有引用指向的对象就是垃圾,有引用指向的就不是垃圾”是对的
孤岛垃圾就是个反驳的例子
class Island{ public Island brother; } //运行下面代码片段 Island il = new Island(); Island i2 = new Island(); Island i3 = new Island(); il.brother = i2; i2.brother = i3; i3.brother = i1; i1 = null; i2 = null; i3 = null; // 这样 三个对象循环指向 但他们形成了孤岛 所以已经成为垃圾
就垃圾回收非线程的例子
class Island{ public Island brother; String name; public Island(){ } public Island(String name){ this.name = name; } public void finalize(){ System.out.println(this.name + "对象成为垃圾,被收集"); } public void testIsland(){ Island i1 = new Island("孤岛中的 O1"); Island i2 = new Island("孤岛中的 O2"); Island i3 = new Island("孤岛中的 O3"); i1.brother = i2; i2.brother = i3; i3.brother = i1; i1 = null; i2 = null; i3 = null; // 这样 三个对象循环指向 但他们形成了孤岛 所以已经成为垃圾 System.gc();//可以看到 三个对象很快被收集,但程序过了10s才结束 try{ Thread.sleep(10000); }catch(Exception e){ e.printStackTrace(); } } } public class Test{ public static void main(String[] args){ new Island().testIsland(); } }
线程垃圾例子
public class Test{ public static void main(String[] args){ // new Island().testIsland(); new RubbishThread().testRT(); } } class RubbishThread extends Thread{ RubbishThread brother; String rtName; public RubbishThread(){ } public RubbishThread(String name){ this.rtName = name; } public void run(){ System.out.println(this.rtName + "线程启动了"); try{ Thread.sleep(1000); }catch(Exception e){ e.printStackTrace(); } System.out.println(this.rtName + "线程结束"); } public void finalize(){ System.out.println(this.rtName + "成为垃圾被收集"); } public void testRT(){ RubbishThread rt1 = new RubbishThread("孤岛中的rt1线程"); RubbishThread rt2 = new RubbishThread("孤岛中的rt2线程"); RubbishThread rt3 = new RubbishThread("孤岛中的rt3线程"); rt1.brother = rt2; rt2.brother = rt3; rt3.brother = rt1; rt1.start(); rt1 = null; rt2 = null; rt3 = null; System.out.println("---------对无引用但活着的线程进行垃圾收集--------------"); System.gc(); try{ Thread.sleep(2000);//主线程休眠2s }catch(Exception e){ e.printStackTrace(); } System.out.println("---------对无引用死亡的线程进行垃圾收集--------------"); System.gc(); try{ Thread.sleep(1000);//主线程休眠1s }catch(Exception e){ e.printStackTrace(); } } // 执行结果 // ---------对无引用但活着的线程进行垃圾收集-------------- // 孤岛中的rt1线程线程启动了 // 孤岛中的rt1线程线程结束 // ---------对无引用死亡的线程进行垃圾收集-------------- // 孤岛中的rt3线程成为垃圾被收集 // 孤岛中的rt2线程成为垃圾被收集 // 孤岛中的rt1线程成为垃圾被收集 //解释:执行第一次垃圾收集由于线程rt1还没有死亡,虽然形成了孤岛垃圾 // 但其中的对象可以被活动的进程访问到,整个孤岛不是垃圾 // 执行第二次垃圾收集时rt1已经死亡 整个孤岛成为垃圾,3个线程都被收集 // 没有启动的线程与死亡的线程一样,只要满足普通对象成为垃圾的条件就是垃圾 }
原文地址;http://blog.csdn.net/kindazrael/article/details/4630159
写的真不错,赞下作者。
相关推荐
Java垃圾回收机制的finalize方法是垃圾回收机制中一个非常重要的概念,它可以帮助开发者更好地理解和掌握垃圾回收机制的工作机理。本文将通过实例形式分析finalize方法的特点及在垃圾回收机制中的相关操作技巧。 一...
《垃圾燃烧机理及设备》 垃圾焚烧是一种有效的固体废物处理方式,旨在实现无害化、减量化、资源化和经济实用。焚烧的核心在于利用废物的热值,使其在特定条件下充分燃烧,从而达到减少体积、消灭病原体并回收能源的...
### 共生网络:异构网络安全高效互联的体系结构与机理 #### 一、引言及背景 共生网络的概念提出旨在解决当前多种网络体制并存环境下存在的互联问题。随着通信技术的发展,出现了多种网络形态,包括但不限于车联网...
总的来说,突发公共卫生事件治理的逻辑机理在于理解事件的复杂性,依赖专业力量,构建高效的运行机制,确保科学决策,协同各方资源,并不断学习与改进。在全球化背景下,国际间的合作与信息共享也至关重要,共同应对...
《垃圾降解微生物机理研究进展》 垃圾填埋作为全球广泛应用的垃圾处理方式,尤其在发展中国家占据主导地位,然而,传统填埋方法存在的问题不容忽视,如垃圾稳定化时间长、渗滤液处理难以及环境污染等。因此,深入...
生活垃圾综合处理系统的除臭机理,.doc
2[1].电子商务模式与机理.pptx
该文档从参考文献中提供了对于孤岛检测方法的研究背景,并且通过基金项目与作者简介,给予了研究工作的支持与背景介绍。 综上所述,分布式发电孤岛检测问题是分布式发电领域内的一个重要研究方向。通过小波变换方法...
钯催化反应的机理主要包括氧化加成、配位、插入和还原消除等步骤,这些步骤共同构成了催化循环。 钯催化的交叉偶联反应是钯催化中最核心的部分,其中包括Heck、Negishi和Suzuki等多种类型。Heck反应是通过不饱和...
垃圾焚烧中二恶英脱除方法及机理整理.pdf
新媒体时代高校科技管理体制机制改革现状研究——评《高校科技创新团队有效性形成机理..pdf
【创新型企业持续创新机制机理分析】 创新型企业是经济增长的核心驱动力,它们通过持续创新保持竞争优势,推动企业和国家的长远发展。本文旨在深入探讨创新型企业持续创新的机制和机理,构建一个综合分析框架,以期...
【网络技术-网络基础-纳米零价铁强化植物修复电子垃圾污染土壤的效果和机理】 电子垃圾处理不当引发的环境污染已成为全球关注的问题。在许多地区,尤其是中国的一些地方,如广东省贵屿镇,传统的手工拆解、焚烧和...
标题中的“Desktop.rar_CH4燃烧机理_CHEMKIN CH4_ch4 机理_chemkin燃烧机理_gri mech2.11”表明我们正在讨论一个与CH4(甲烷)燃烧机理相关的主题,具体是使用CHEMKIN软件进行分析的。CH4燃烧机理是指描述甲烷在燃烧...
水泥水化机理.pdf
聚氨酯粘接机理.doc
正庚烷机理是化学反应动力学中的一个重要概念,特别是在柴油机的研究中具有核心地位。柴油机的工作原理依赖于燃料的燃烧过程,而这一过程是由一系列复杂的化学反应组成的。正庚烷,作为一种常见的烃类化合物,经常被...