记录学习的点滴(Java内存泄漏)


Java内存泄露
1、定义
不再使用的对象持续占用内存或不再使用的对象的内存得不到及时释放,从而造成内存空间的浪费。
(不再会被使用的对象的内存不能被回收)
2、例子及解决方案
--1对象都是有生命周期的,有的长,有的短,如果长生命周期的对象持有短生命周期的引用,就很可能会出现内存泄露。
public class Simple {
    Object object;
    public void method1(){
        object = new Object();
        //...其他代码
    }
}
这里的object实例,其实我们期望它只作用于method1()方法中,且其他地方不会再用到它,但是,当method1()方法执行完成后,object对象所分配的内存不会马上被认为是可以被释放的对象,只有在Simple类创建的对象被释放后才会被释放,严格的说,这就是一种内存泄露。解决方法就是将object作为method1()方法中的局部变量。当然,如果一定要这么写,可以改为这样:
public class Simple {
    Object object;
    public void method1(){
        object = new Object();
        //...其他代码
        object = null;
    }
}
这样,之前“new Object()”分配的内存,就可以被GC回收。
在内存对象明明已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用),这是所有语言都有可能会出现的内存泄漏方式。编程时如果不小心,我们很容易发生这种情况,如果不太严重,可能就只是短暂的内存泄露。
--2容器使用时的内存泄露
    void method(){
        Vector vector = new Vector();
        for (int i = 1; i<100; i++)
        {
            Object object = new Object();
            vector.add(object);
            object = null;
        }
        //...对vector的操作
        //...与vector无关的其他操作
    }
这里内存泄露指的是在对vector操作完成之后,执行下面与vector无关的代码时,如果发生了GC操作,这一系列的object是没法被回收的,而此处的内存泄露可能是短暂的,因为在整个method()方法执行完成后,那些对象还是可以被回收。这里要解决很简单,手动赋值为null即可。
    void method(){
        Vector vector = new Vector();
        for (int i = 1; i<100; i++)
        {
            Object object = new Object();
            vector.add(object);
            object = null;
        }
        //...对v的操作
        vector = null;
        //...与v无关的其他操作
    }
--3各种提供了close()方法的对象
比如数据库连接(dataSourse.getConnection()),网络连接(socket)和io连接,以及使用其他框架的时候,除非其显式的调用了其close()方法(或类似方法)将其连接关闭,否则是不会自动被GC回收的。其实原因依然是长生命周期对象持有短生命周期对象的引用。可能很多人使用过hibernate,我们操作数据库时,通过SessionFactory获取一个session。
Session session=sessionFactory.openSession();
完成后我们必须调用close()方法关闭。
session.close();
SessionFactory就是一个长生命周期的对象,而session相对是个短生命周期的对象,但是框架这么设计是合理的:它并不清楚我们要使用session到多久,于是只能提供一个方法让我们自己决定何时不再使用。因为在close()方法调用之前,可能会抛出异常而导致方法不能被调用,我们通常使用try语言,然后再finally语句中执行close()等清理工作。
    try{
        session=sessionFactory.openSession();
        //...其他操作
    }finally{
        session.close();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值