java的內存管理

Java的垃圾回收機制

“c++程序員覺得內存管理太重要了,所以內存一定要自己進行管理;Java/C#程序員覺得內存管理太重要了,所以一定不要自己去管理。”

Java中使用被稱爲垃圾回收集器的技術來監視Java程序的運行,當對象不再使用時就會自動釋放對象使用的內存。

Java中使用一些軟指針來指向對象的引用。

Java的垃圾回收集能夠以單獨的線程在後臺運行,並依次檢查每個對象。

垃圾回收集是自動運行的,一般情況下,不需要顯示調用。垃圾回收集會不時檢查對象的使用。

Java垃圾回收集並不能完全阻止內存溢出情況。例如:當創建一個引用對象時,其他的引用對象沒有被拋棄,也會造成內存溢出的情況。

Java垃圾回收並不是一個獨立的平臺,它具有平臺依賴。

Java垃圾回收集:gc即垃圾回收集,是指JVM用於釋放那些不再使用的對象所佔的內存資源。

Java的垃圾回收機制是爲所有的應用程序服務的,而不是爲某個程序單獨服務的。因此,任何一個程序都不能命令垃圾回收機制做什麼,怎麼做或做多少。

Java中提供一些和垃圾收集打交道的類,而且提供了一種強行執行垃圾收集的方法——調用System.gc(),但這同樣是一個不確定的方法。Java中並不保證每次調用該方法就一定能啓動垃圾收集,它只不過會向jvm發出這樣的一個申請,到底是否真正的執行垃圾回收,一切都是個未知數。

Java中一般來說,如果沒有特殊情況就使用jvm默認選項。增量收集器比較適用於實時性要求比較高的系統中;若系統具有較高的配置,有比較多的閒置資源,則可以考慮使用並行標記/清除收集器。

對於頻繁調用內存和釋放內存的操作還是自己管理內存,System.gc()並不一定管用,可以使用finalize強制執行,或自己編寫finalize方法。

——————摘自書籍《Java程序員面試寶典

舉例:

來自:http://blog.csdn.net/javayohn/article/details/3202064

程序段2:

  1.Object sobj = new Object ( ) ;

  2.Object sobj = null ;

  3.Object sobj = new Object ( ) ;

  4.sobj = new Object ( ) ;

  問:這段代碼中,第幾行的內存空間符合垃圾收集器的收集標準?

  答:第1行和第3行。因爲第2行爲sobj賦值爲null,所以在此第1行的sobj符合垃圾收集器的收集標準。而第4行相當於爲sobj賦值爲null,所以在此第3行的sobj也符合垃圾收集器的收集標準。

  如果有一個對象的句柄a,且你把a作爲某個構造器的參數,即 new Constructor ( a )的時候,即使你給a賦值爲null,a也不符合垃圾收集器的收集標準。直到由上面構造器構造的新對象被賦空值時,a纔可以被垃圾收集器收集。

  程序段3:

  1.Object aobj = new Object ( ) ;

  2.Object bobj = new Object ( ) ;

  3.Object cobj = new Object ( ) ;

  4.aobj = bobj;

  5.aobj = cobj;

  6.cobj = null;

  7.aobj = null;

  問:這段代碼中,第幾行的內存空間符合垃圾收集器的收集標準?

  答:第7行。注意這類題型是認證考試中可能遇到的最難題型了。

  行1-3分別創建了Object類的三個對象:aobj,bobj,cobj


  行4:此時對象aobj的句柄指向bobj,所以該行的執行不能使aobj符合垃圾收集器的收集標準。

  行5:此時對象aobj的句柄指向cobj,所以該行的執行不能使aobj符合垃圾收集器的收集標準。

  行6:此時仍沒有任何一個對象符合垃圾收集器的收集標準。

  行7:對象cobj符合了垃圾收集器的收集標準,因爲cobj的句柄指向單一的地址空間。在第6行的時候,cobj已經被賦值爲null,但由cobj同時還指向了aobj(第5行),所以此時cobj並不符合垃圾收集器的收集標準。而在第7行,aobj所指向的地址空間也被賦予了空值null,這就說明了,由cobj所指向的地址空間已經被完全地賦予了空值。所以此時cobj最終符合了垃圾收集器的收集標準。 但對於aobj和bobj,仍然無法判斷其是否符合收集標準。

  總之,在Java語言中,判斷一塊內存空間是否符合垃圾收集器收集標準的標準只有兩個:

  1.給對象賦予了空值null,以下再沒有調用過。

  2.給對象賦予了新值,既重新分配了內存空間。

  最後再次提醒一下,一塊內存空間符合了垃圾收集器的收集標準,並不意味着這塊內存空間就一定會被垃圾收集器收集。

舉例:如果有一個對象的句柄a,且你把a作爲某個構造器的參數,即 new Constructor(a),則即使你把a賦值爲null,a也不符合垃圾收集器的收費標準。直到由上面的構造器構造新的對象杯賦空值時,a纔可以被垃圾收集器收集




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章