1.回收对象占用的内存
对于内存的回收,JAVA与C++不同。在C++中,对象占用的内存,其回收是明确无误的。在栈中分配的对象,当代码的运行离开对象的作用域时,系统自动调用对象的析构函数,然后回收内存。对于在堆中为对象分配的内存,即使离开分配时的作用域,系统也不回收内存,只有开发者调用如delete这样的操作符时,系统才会调用对象的析构函数,然后回收内存。如果发开者忘记调用delete回收堆中分配的对象占用的内存,就内存泄露了。
而在JAVA中,所有对象都是在堆中分配的,并且对象没有析构函数。开发者无需关心对象占用的内存回收问题。Java实现了垃圾自动回收机制。如下面这样:
1 public static void main(String[] args) {
2 Test t = new Test();
3 t = new Test();
4 t = null;
5 }
在第二行为t创建了对象,此时新创建的对象是可达的,因为有"t"这个句柄指向它,所以这个对象不会被当成垃圾回收。
在第三行为t重新创建了对象,此时在第二行为t创建的对象就没有句柄指向它,它变成不可达的状态,这个时候第二行分配的对象就可以当成垃圾回收了。
在第四行将t放空。同理,第三行分配的对象也变成不可达,这个时候第三行创建的对象也可以回收了。
这种机制使程序员不用再关心内存的回收问题,只管创建不管回收,回收由系统负责,当然也就避免了因为程序员粗心而造成的内存泄漏。当然代价就是效率,内存的回收由系统控制,什么时候回收是不确定