疯狂java笔记——对象和垃圾回收

--回收机制只负责回收堆内存中的对象,不会回收物理资源,如数据库连接,网络io

--程序无法控制垃圾回收,对象永久失去引用后,系统会在合适时间回收它所占内存

--垃圾回收机制在回收任何对象之前,会调用finalize()方法,该方法可能使该对象重新复活(重新引用该对象),从而导致垃圾回收机制取消。

对象在内存中的状态

--可达状态,程序可以通过变量引用该对象(或者该变量的实例变量和方法)

--可恢复状态,(此对象没有被程序中的任何变量引用),系统的垃圾回收机制准备回收该对象所占内存前,调用finaize()方法。可以让一个变量重新引用该对象那个,否则进入不可达状态

--不可达状态,对象与所有引用变量联系切断,系统调用所有对象的finalize()方法后依然没有变化,那么这个对象会永久失去引用,系统会回收资源

public class StatusTranfer

{

public static void test()

{

String a = new String("轻量级Java EE企业应用实战"); //①

a = new String("疯狂Java讲义"); //②

}

public static void main(String[] args)

{

test(); //③

}

}

在1中,创建变量a并赋予对象字符串"轻量级Java EE企业应用实战"

但是在2中重新赋予a对象“疯狂Java讲义”

此时字符串对象"轻量级Java EE企业应用实战"处于可恢复状态,"疯狂Java讲义"处于可达状态

强制垃圾回收

当一个对象失去引用后,系统何时调用finalize()方法,什么时候使它变成不可达状态,系统何时回收它所占有的内存,对于程序完全透明,程序只能控制一个对象何时不再被任何引用变量引用,决不能控制它何时回收。

强制垃圾回收是通知系统进行垃圾回收,但系统是否进行回收还不能确定。

强制垃圾回收有如下两种方式:

--调用system类的gc()静态方法:System.gc();

--调用Runtime对象的gc()实例方法:Runtime.getRuntime().gc();

猜你喜欢

转载自blog.csdn.net/qq_36332133/article/details/81194736