首先我們應該知道,java不要求程序員顯示的分配內存和釋放內存,這樣可以避免很多潛在問題。java在創建對象時會自動分配內存,
並當該對象的引用不存在時釋放這塊內存。
而所謂的內存管理就是對象的分配和釋放問題。在java中,程序員通過new關鍵字爲對象申請內存空間(不包括基本類型),所有的對象的是
在堆中的。而對象的釋放是右GC決定的。可以看出java內存分配是由程序完成的,而釋放則是由GC完成的,這樣雖然簡化了程序員的工作,
但是加重了JVM的工作。這就是大家感覺java程序運行速度比較慢的原因之一。因爲GC爲了能夠正確釋放內存,必須要監控每一個對象的運行
狀態。
在內存管理中,最應該注意的就是內存泄露。在java中內存泄露就是存在一些被分配的對象,滿足下面兩個特點
1)對象時可達的,就是說在有向圖中,存在通路可以與其相連
2)對象時無用的,即程序以後不會再使用這些對象
一旦滿足這兩個條件,這些對象就可以判定爲java中的內存泄露,這些對象不會被回收,但是他們卻佔用着內存。
下面寫一段內存泄露代碼
Vector v = new Vector(10);
for(int i=1;i<500;i++){
Object o = new Object();
v.add(o);
o = null;
}
從上面代碼可以看出來,循環建立的對象添加到vector中,後面雖然把所有o賦值爲null,但是因爲v引用了這些對象,所以Object對象沒有被釋放。
所以此時出現內存泄露。最簡單的解決辦法就是講Vector對象設置爲null。