C语言要求程序员显示的分配内存,释放内存
java语言不要求程序员分配内存和释放内存,避免很多潜在的问题。java在创建对象时自动分配内存,并当该对象的引用不存在时释放这块内存
回收机制有如下特点:
只负责回收堆内存中的对象,不负责回收物理资源,例如数据库连接
程序无法控制垃圾回收什么时候进行,它会在合适的时候进行
回收任何对象之前先调用finalize()方法,能够使对象恢复,让一个引用变量引用该对象,
对象在内存中的三种状态:
可达状态:对象创建之后,有一个或者多个引用变量指向改对象,可以通过这些引用变量调用该对象的实例变量和实例方法
可恢复状态:程序中某个对象没有引用变量,为可恢复状态,在这个状态下,系统的垃圾回收机制准备回收该对象所占内存,回收之前会调用finalize()方法,如果系统在调用此方法时能够让一个引用变量重新引用该对象,则进入可达状态,否则进入不可达状态。
不可达状态:当对象与其他任何引用变量没有关联,且已经执行了finalize()方法仍然没有进入可达状态,则永久性的失去引用。只有是不可达状态的对象才能被回收
强制垃圾回收:
程序只能控制一个对象何时不再被任何引用变量引用,但是不能控制何时被回收
强制系统进行垃圾回收——只是通知系统进行垃圾回收
强制垃圾回收有两种方式:
System.gc()
RunTime.getRunTime().gc()
public classtest1 {public static voidmain(String[] args) {for(int i=0;i<10;i++){newtest1();
}
}
@Overrideprotected void finalize() throwsThrowable {//TODO Auto-generated method stub
System.out.println("调用finalize");
}
}
运行上面代码,没有任何输出,系统并没有调用finalize()
public classtest1 {public static voidmain(String[] args) {for(int i=0;i<10;i++){newtest1();//System.gc();
Runtime.getRuntime().gc();
}
}
@Overrideprotected void finalize() throwsThrowable {//TODO Auto-generated method stub
System.out.println("调用finalize");
}
}
加上 //System.gc(); Runtime.getRuntime().gc();任何一句会调用finalize(),但是只是建议回收机制回收,可能不会立即回收
finalize()方法:
在垃圾回收机制准备回收某对象所占用内存之前会先清理资源,如果没有明确指定回收资源的情况下,java会提供默认清理该对象资源的机制,为finalize()方法
任何object类都可以重写finalize()方法
垃圾回收机制调用该对象的finalize()是透明的,不能明确什么时候会调用,只有在程序认为需要更多额外内存,垃圾回收机制才会进行垃圾回收
finalize()有如下四个特点:
不会主动调用某个对象的finalize()方法,交给回收机制进行调用
finalize()是否会被调用,何时调用,是不确定的,不是一个一定会执行的方法
当JVM执行finalize()方法时,可能会使该对象及程序中的其他对象重新回到可达状态
当JVM执行finalize()方法出现异常时,不会报异常,会继续执行程序