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;  
        }  
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值