--回收机制只负责回收堆内存中的对象,不会回收物理资源,如数据库连接,网络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();