垃圾回收是Java程序设计汇总内存管理的核心概念。
JVM的内存管理机制被称为垃圾回收机制,它负责自动回收那些无用对象所占用的内存。
对象什么时候称为垃圾(强引用)
一个对象创建后被防止在JVM的堆内存中,只有当对象不在被程序中的任何引用变量引用时,他的内存才可能被回收。
当垃圾回收器将要回收无用对象的内存时,先调用该对象的 finalize() 方法,该方法有可能使对象复活,导致垃圾回收器取消回收该对象的内存。
JVM的垃圾回收操作对程序来说都是透明的。因此程序无法预料某个无用对象的 finalize() 方法何时被释放。
finalize() 方法的特点:
垃圾回收器是否会执行该方法,何时执行该方法,都是不确定的。
finalize() 方法有可能使对象复活,使它恢复到可触及状态。
垃圾回收器在执行 finalize() 方法时,如果出现异常,垃圾回收器不会报告异常,程序继续正常运行。
垃圾回收器作为低优先级线程独立运行,在任何时候,程序都无法迫使垃圾回收器立即执行垃圾回收操作。
程序中可调用的 System.gc() 或 Runtime 中的 gc() 方法提示垃圾回收器尽快执行垃圾回收操作,但是不能保证调用后垃圾回收器会立即执行垃圾回收。
垃圾回收机制可以有效防范动态内存分配中可能发生的两个危险:
因内存垃圾过多而引发的内存耗尽,不恰当的内存释放所造成的内存非法引用。
public class GCTest { public static void main(String[] args) { // TODO Auto-generated method stub new People(); //匿名对象,用完一次就被回收 //第一种方法 System.gc();//提示垃圾回收器尽快回收对象所占用的内存 //第二种方法 // Runtime r = Runtime.getRuntime(); // r.gc();//提示垃圾回收器尽快回收对象所占用的内存 } }
public class People { //属性:成员变量 public String name;//默认为null public char sex;//默认为'u0000'(空字符) public int age;//默认为0 //在Object类中定义的方法,在对象被回收前调用 protected void finalize() throws Throwable { super.finalize(); System.out.println("对象被回收"); } }