java内存泄漏原因_jvm内存泄漏原因及处理
关于这题也答得很烂,虽然之前已经看过了,但是可能是死记硬背的原因,答得太模糊了。Java中的内存泄露,广义并通俗的说,就是:不再会被使用的对象的内存不能被回收,就是内存泄露。如果长生命周期的对象持有短生命周期的引用,就很可能会出现内存泄露。public class Simple{Object object;void method () {object = new Object();}}就像上...
关于这题也答得很烂,虽然之前已经看过了,但是可能是死记硬背的原因,答得太模糊了。
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是短对象。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)