Java 內存泄漏

Java 中內存是如何管理的程序員

爲了判斷Java中是否有內存泄露,咱們首先必須瞭解Java是如何管理內存的。Java的內存管理就是對象的分配和釋放問題。在Java中,程序員須要經過關鍵字new爲每一個對象申請內存空間 (基本類型除外),全部的對象都在堆 (Heap)中分配空間。另外,對象的釋放是由GC決定和執行的。在Java中,內存的分配是由程序完成的,而內存的釋放是有GC完成的,這種收支兩條線的方法確實簡化了程序員的工做。但同時,它也加劇了JVM的工做。這也是Java程序運行速度較慢的緣由之一。由於,GC爲了可以正確釋放對象,GC必須監控每個對象的運行狀態,包括對象的申請、引用、被引用、賦值等,GC都須要進行監控。編程

監視對象狀態是爲了更加準確地、及時地釋放對象,而釋放對象的根本原則就是該對象再也不被引用。函數

下面請看示例:工具


public class Main{
public static void main(String args[]){
Object obj1= new Object();//obj1
Object obj2= new Object();//obj2
obj2= obj1;
//此處爲第6行
}
}
1
2
3
4
5
6
7
8
9測試

內存的釋放,也即清理那些不可達的對象,是由GC決定和執行的,因此GC會監控每個對象的狀態,包括申請、引用、被引用和賦值等。釋放對象的根本原則就是對象不會再被使用:對象

`給對象賦予了空值null,以後再沒有調用過。`
`另外一個是給對象賦予了新值,這樣從新分配了內存空間。`
1
2
什麼是Java中的內存泄露生命週期

  Java中的內存泄露,廣義並通俗的說,就是:再也不會被使用的對象的內存不能被回收,就是內存泄露。事件

  Java中的內存泄露與C++中的表現有所不一樣。內存

  在C++中,全部被分配了內存的對象,再也不使用後,都必須程序員手動的釋放他們。因此,每一個類,都會含有一個析構函數,做用就是完成清理工做,若是咱們忘記了某些對象的釋放,就會形成內存泄露。開發

  可是在Java中,咱們不用(也沒辦法)本身釋放內存,無用的對象由GC自動清理,這也極大的簡化了咱們的編程工做。但,實際有時候一些再也不會被使用的對象,在GC看來不能被釋放,就會形成內存泄露。

 &emspl;經過分析,咱們得知,對於C++,程序員須要本身管理邊和頂點,而對於Java程序員只須要管理邊就能夠了(不須要管理頂點的釋放)。經過這種方式,Java提升了編程的效率。

所以,經過以上分析,咱們知道在Java中也有內存泄漏,但範圍比C++要小一些。由於Java從語言上保證,任何對象都是可達的,全部的不可達對象都由GC管理。

下面給出了一個簡單的內存泄露的例子。在這個例子中,咱們循環申請Object對象,並將所申請的對象放入一個Vector中,若是咱們僅僅釋放引用自己,那麼Vector仍然引用該對象,因此這個對象對GC來講是不可回收的。所以,若是對象加入到Vector後,還必須從Vector中刪除,最簡單的方法就是將Vector對象設置爲null。

Vector v=new Vector(10);

for (int i=1;i<100; i++){
Object o=new Object(http://www.my516.com);
v.add(o);
o=null;
}
//此時,全部的Object對象都沒有被釋放,由於變量v引用這些對象。
1
2
3
4
5
6
7
8
如何防止內存泄漏的發生?

 好的測試工具

  在開發中不能徹底避免內存泄漏,關鍵要在發現有內存泄漏的時候能用好的測試工具迅速定位問題的所在。市場上已有幾種專業檢查 Java 內存泄漏的工具,它們的基本工做原理大同小異,都是經過監測 Java 程序運行時,全部對象的申請、釋放等動做,將內存管理的全部信息進行統計、分析、可視化。開發人員將根據這些信息判斷程序是否有內存泄漏問題。這些工具包括 Optimizeit Profiler、JProbe Profiler、JinSight、Rational 公司的 Purify 等。

 注意像 HashMap 、ArrayList 的集合對象

  特別注意一些像 HashMap 、ArrayList 的集合對象,它們常常會引起內存泄漏。當它們被聲明爲 static 時,它們的生命週期就會和應用程序同樣長。

 注意 事件監聽 和 回調函數

  特別注意 事件監聽 和 回調函數 。當一個監聽器在使用的時候被註冊,但再也不使用以後卻未被反註冊。

總結:

  綜上所述,Java也存在內存泄露問題,其緣由主要是一些對象雖然再也不被使用,但它們仍然被引用。爲了解決這些問題,咱們能夠經過軟件工具來檢查內存泄露,檢查的主要原理就是暴露出全部堆中的對象,讓程序員尋找那些無用但仍被引用的對象。---------------------

相關文章
相關標籤/搜索