Java 内存释放
除了扩大java虚拟机内存之外,我们还需要对自己的程序进行优化,
1、那就是让自己编写的程序符合垃圾回收的机制,
2、然后就是手动的调用System.gc();
?
?
下面分几点符合gc的条件。
(1) 空引用 :当对象没有对他可到达引用时,他就符合垃圾回收的条件。也就是说如果没有对他的引用,删除对象的引用就可以达到目的,因此我们可以把引用变量设置为 null,来符合垃圾回收的条件。?
StringBuffer?sb?=?new?StringBuffer("hello");??
System.
out.println(sb);??
sb=null;?
(2) 重新为引用变量赋值:可以通过设置引用变量引用另一个对象来解除该引用变量与一个对象间的引用关系。
StringBuffer sb1 = new StringBuffer("hello");??
StringBuffer sb2 = new StringBuffer("goodbye");??
System.out.println(sb1);??
sb1=sb2;//此时"hello"符合回收条件
(3) 方法内创建的对象:所创建的局部变量仅在该方法的作用期间内存在。一旦该方法返回,在这个方法内创建的对象就符合垃圾收集条件。有一种明显的例外情况,就是方法的返回对象。
public static void main(String[] args) {??
??????? Date d = getDate();??
??????? System.out.println("d = " + d);??
}??
private static Date getDate() {??
??????? Date d2 = new Date();??
??????? StringBuffer now = new StringBuffer(d2.toString());??
??????? System.out.println(now);??
??????? return d2;??
}
返回的是对象,而且这个对象还在以后的程序中要用,所以不会释放。
(4) 隔离引用:这种情况中,被回收的对象仍具有引用,这种情况称作隔离岛。若存在这两个实例,他们互相引用,并且这两个对象的所有其他引用都删除,其他任何线程无法访问这两个对象中的任意一个。也可以符合垃圾回收条件。
public class Island {??
??????? Island i;??
??????? public static void main(String[] args) {??
??????????????? Island i2 = new Island();??
??????????????? Island i3 = new Island();??
??????????????? Island i4 = new Island();??
??????????????? i2.i=i3;??
??????????????? i3.i=i4;??
??????????????? i4.i=i2;??
??????????????? i2=null;??
??????????????? i3=null;??
??????????????? i4=null;??
??????? }??
}
?
?