2024年4月4日发(作者:)

java释放内存的方法

除了扩大java虚拟机内存之外,我们还需要对自己的程序进行优化,

1、那就是让自己编写的程序符合垃圾回收的机制,

2、然后就是手动的调用();

下面分几点符合gc的条件。

(1) 空引用 :当对象没有对他可到达引用时,他就符合垃圾回收的条件。

也就是说如果没有对他的引用,删除对象的引用就可以达到目的,因此我们可以

把引用变量设置为 null,来符合垃圾回收的条件。

StringBuffer sb = new StringBuffer("hello");

System.

n(sb);

sb=null;

(2) 重新为引用变量赋值:可以通过设置引用变量引用另一个对象来解除该引

用变量与一个对象间的引用关系。

StringBuffer sb1 = new StringBuffer("hello");

StringBuffer sb2 = new StringBuffer("goodbye");

n(sb1);

sb1=sb2;//此时"hello"符合回收条件

(3) 方法内创建的对象:所创建的局部变量仅在该方法的作用期间内存在。

一旦该方法返回,在这个方法内创建的对象就符合垃圾收集条件。有一种明显的

例外情况,就是方法的返回对象。

public static void main(String[] args) {

Date d = getDate();

n("d = " + d);

}

private static Date getDate() {

Date d2 = new Date();

StringBuffer now = new StringBuffer(ng());

n(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;

}

}