關于這題也答得很爛,雖然之前已經(jīng)看過了,但是可能是死記硬背的原因,答得太模糊了。
Java中的內(nèi)存泄露,廣義并通俗的說,就是:不再會被使用的對象的內(nèi)存不能被回收,就是內(nèi)存泄露。
如果長生命周期的對象持有短生命周期的引用,就很可能會出現(xiàn)內(nèi)存泄露。
public class Simple {
Object object;
void method () {
object = new Object();
}
}
就像上面的代碼,嚴格意義上就是一種內(nèi)存泄漏,因為object不再被使用了,但它不會被立即回收,而是得等到Simple對象被釋放的時候。
可以這樣寫
public class Simple {
Object object;
void method () {
Object object = new Object();
//使用Object
object = null;
}
}
把Object定義為局部變量,并在最后賦值為null
因此,解決內(nèi)存泄漏的一個方法,就是盡量降低變量的作用域,以及及時把對象復制為可清理對象(null)
如ArrayList的pop()方法
public E pop(){
if(size == 0)
return null;
else{
E e = (E) elementData[--size];
elementData[size] = null;
return e;
}
}
容器使用時的內(nèi)存泄漏
Vector vector = new Vector();
for (int i = 1; i<100; i++)
{
Object object = new Object();
vector.add(object);
object = null;
}
//...對vector的操作
//...與vector無關的其他操作
}
這里其實只是會造成短暫的內(nèi)存泄漏,在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()方法導致的內(nèi)存泄漏
在各種IO或者數(shù)據(jù)庫連接時,都需要在最后通過close()方法釋放對象,這里也是長對象引用短對象是造成的內(nèi)存泄漏
如
SessionFactory factory = new SessionFactory();
try {Session session = factory.connect();
} finally{
session.close();
}
這里必須用close關閉連接,因為SessionFactory是長對象,session是短對象。