java垃圾回收机制:当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
- 栈:在内存中开辟空间用于存储对象。
- 堆:在内存中开辟空间用于存储数据。
- 指向:栈空间中的对象与堆空间的数据存在的一种引用关系。
示例:
public Object finalize(){
Object num=new Integer(0);
//在此实际创建了两个对象,num对象与Integer对象,此时num指向堆空间中的数据0,Integer对象
创建完成后被垃圾回收机制回收。
Object [] ob=new Object [1];
ob[0]=num;
//让ob同样指向0,此时num与ob同时指向0。
num=null;
num1[0]=null;
return 0;
}
当代码运行至第5行时JVM将自动启动垃圾回收机制,此时堆内存中的数据0在栈内存中没有任何引用。由此我们可以得出,当JVM监听到堆内存中的数据无任何引用时会自动启动垃圾回收机制。
- 内存泄露:程序在运行过程中,当堆内存中的数据一直运行不能被正确回收时称为内存泄露。
示例:
public Object finalize(){
Object num=new Integer(0);
Object[] ob=new Object [1];
num=null;
ob[0]=num;
}
上面这段代码将会发生内存泄露。首先程序在内存中开辟出num与ob的栈内存空间,并同时指向堆内存中的数据0,当代码执行至第4行时num被清空,在此之前ob对象并没有任何指向,当num对象被设置为null时,堆内存空间中的数据0此时应该被垃圾回收机制回收,但是当代码执行至第5行时,num对象被赋值给ob对象,这将导致num申请的内存空间不能被释放。如有不对,欢迎批评指正。
- 如何避免内存泄露:
- 在使用具有存储功能的集合,到程序结束时需将存储容器设置为null。
- 数据库连接、数据流读取时记得关闭连接。