对象成为垃圾的条件
1.对于非线程对象来说 当所有的活动线程都不可能访问到这对象时,变成垃圾
2.对于线程对象来说 除了上一条之外,还要求吃线程本身已经死亡或者还处于新建状态,才是垃圾,才能被回收
千万不要片面的认为“没有引用指向的对象就是垃圾,有引用指向的就不是垃圾”是对的
孤岛垃圾就是个反驳的例子
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();
}
}
}
但线程上的孤岛又不点不同了
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 static void testThreadIsland(){
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个线程都被收集
// 没有启动的线程与死亡的线程一样,只要满足普通对象成为垃圾的条件就是垃圾
}
分享到:
相关推荐
而在这棵树之外的孤岛对象或者由于循环引用形成的孤岛对象集合被标记为“无效”,垃圾收集器会在合适的时间销毁这些无效对象,完成一次垃圾收集。而垃圾收集器是运行在虚拟机中的一个低优先级的守护进程,为了不影响...
程序员虽然不能控制垃圾回收器的执行,但可以通过编程手段让对象符合回收条件,例如让对象成为“孤岛”,即对象之间不再相互引用,且所有引用对象的变量都被置为null,从而使得这些对象变为垃圾回收器可以回收的对象...
2. 业务流程分析与优化:垃圾分类与回收机构、垃圾加工与处理企业的多层供应链进行业务流程的分析和优化。 3. 激励机制设计:设计有效的激励机制,使供应链的运作能够被垃圾分类驱动,并且能被市场需求拉动。 4. 再...
总之,垃圾发电厂的自动化技术通过先进的控制策略和设备,实现了垃圾处理的高效化、环保化,提升了能源回收效率,减少了对环境的负面影响。随着技术的不断发展,垃圾发电厂的自动化水平将进一步提高,为可持续发展...
深入学习还包括反射、注解、泛型、模块化系统(如Java 9以后的模块系统)、垃圾回收机制以及JVM优化等方面。此外,熟练运用设计模式,如工厂模式、单例模式、观察者模式等,是提高代码质量和可维护性的关键。 集成...
特色服务包括全国首创的中央厨房养老服务和社区垃圾回收积分兑换,以及虚拟园林年卡和二维码支付等功能,大大提升了服务的便利性和覆盖面。这种创新模式旨在构建一个以市民为中心的服务体系,让市民在15分钟生活圈内...
美国密歇根州的"回收奖励"项目,通过激励机制推动垃圾分类和回收;美国大鸭岛的生态环境监测系统,实时监控生态环境变化;以及塞尔维亚的河川水质污染管理系统,预警水污染事件,这些都展示了信息技术在环保领域的...
白皮书在应用章节介绍了垃圾分类与回收、垃圾清扫与清运、垃圾处理与利用等领域的具体应用案例,展示了如何通过互联网平台将智能化技术与环卫服务相结合,以提高整体的运营效率和服务质量。 最后,白皮书在建议章节...
它旨在解决城市化进程中出现的各种环境问题,如垃圾处理、清扫保洁、资源回收等,通过科技手段实现环卫工作的精细化、高效化。 1.1 智慧环卫的背景和发展机遇 随着经济的快速发展,城市化进程加快,我国城市化率在...
1. **生活信息提醒**:例如水电煤气费用缴纳通知、垃圾回收日提醒、社区活动信息等,帮助居民更好地安排日常生活。 2. **公共服务预约**:如预约医疗机构、图书馆、体育设施等,减少等待时间,提高服务效率。 3. *...
- Common Language Runtime (CLR): 执行环境,负责代码的编译、垃圾回收、异常处理等。 - Framework Class Library (FCL): 一组预定义的类库,为开发者提供各种功能,如数据库访问、网络通信等。 - ASP.NET: 用于...
- **环保**:如餐厨垃圾回收,推动可持续发展。 6. **建设原则**: - **示范性**:选取关键需求,展示物联网在城市安全中的作用。 - **性价比**:选择最优方案,降低成本,提高效益。 - **规模性**:逐步扩大...
- **优点**:可移植性强、安全性高、面向对象、自动垃圾回收机制。 4. **SSM框架**(Spring+SpringMVC+MyBatis): - **简介**:SSM框架结合了Spring、SpringMVC以及MyBatis三个框架的功能,使得它们能够协同工作...
1. **JVM原理**:理解垃圾回收机制,内存模型(堆、栈、方法区、本地方法栈)。 2. **反射机制**:知道如何动态加载类,调用方法,修改属性值。 3. **设计模式**:了解常见的23种设计模式,如单例、工厂、装饰器等...
- 提升环境卫生管理水平,支持垃圾分类与回收。 8. **绿化管理子系统** - 实现绿化资源的精细化管理,支持植被生长监测。 9. **市政综合管理云平台** - 作为核心平台,整合各子系统数据,支持跨部门协作。 通过...