java内存泄漏原因_jvm内存泄漏原因及处理

关于这题也答得很烂,虽然之前已经看过了,但是可能是死记硬背的原因,答得太模糊了。

Java中的内存泄露,广义并通俗的说,就是:不再会被使用的对象的内存不能被回收,就是内存泄露。

如果长生命周期的对象持有短生命周期的引用,就很可能会出现内存泄露。

public class Simple {

Object object;

void method () {

object = new Object();

}

}

就像上面的代码,严格意义上就是一种内存泄漏,因为object不再被使用了,但它不会被立即回收,而是得等到Simple对象被释放的时候。

可以这样写

public class Simple {

Object object;

void method () {

Object object = new Object();

//使用Object

object = null;

}

}

把Object定义为局部变量,并在最后赋值为null

因此,解决内存泄漏的一个方法,就是尽量降低变量的作用域,以及及时把对象复制为可清理对象(null)

如ArrayList的pop()方法

public E pop(){

if(size == 0)

return null;

else{

E e = (E) elementData[--size];

elementData[size] = null;

return e;

}

}

容器使用时的内存泄漏

Vector vector = new Vector();

for (int i = 1; i<100; i++)

{

Object object = new Object();

vector.add(object);

object = null;

}

//...对vector的操作

//...与vector无关的其他操作

}

这里其实只是会造成短暂的内存泄漏,在method方法结束后还是会把回收的,更好的写法是:

Vector vector = new Vector();

for (int i = 1; i<100; i++)

{

Object object = new Object();

vector.add(object);

object = null;

}

//...对vector的操作

vector = null;

//...与vector无关的其他操作

}

close()方法导致的内存泄漏

在各种IO或者数据库连接时,都需要在最后通过close()方法释放对象,这里也是长对象引用短对象是造成的内存泄漏

SessionFactory factory = new SessionFactory();

try {Session session = factory.connect();

} finally{

session.close();

}

这里必须用close关闭连接,因为SessionFactory是长对象,session是短对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值