內存概念隨筆

  • 當需要加載類的時候,相應的class loader會首先把請求委派給父class loader,只有當父class loader加載失敗後,該class loader纔會自己定義並加載類,這就是Java自己的“雙親委派加載鏈”結構。

  • 如果說一個對象已經不被任何程序邏輯所需要但是還存在被根元素引用的情況,我們可以說這裏存在內存泄露。

  • MAT 支持用 OQL(Object Query Language)對 heap dump 中的對象進行查詢,支持對線程的分析等。

  • JVM根據generation(代)來進行GC,generation被分爲young generation(年輕代)、tenured generation(老年代)、permanent generation(永久代, perm gen),perm gen(或稱Non-Heap 非堆)是個異類。注意,heap空間不包括perm gen。

  • perm gen,它是JVM用來存儲無法在Java語言級描述的對象,這些對象分別是類和方法數據(與class loader有關)以及interned strings(字符串駐留)。利用interned strings(或者class loader加載大量的類)很容易把perm gen撐破,如下:
    for(int i=0; i<10000000; i++){
    String d = String.valueOf(i).intern();
    array[i]=d;
    }

  • 絕大多數的對象都在young generation被分配,也在young generation被收回,當young generation的空間被填滿,GC會進行minor collection(次回收),這次回收不涉及到heap中的其他generation,minor collection根據weak generational hypothesis(弱年代假設)來假設young generation中大量的對象都是垃圾需要回收,minor collection的過程會非常快。young generation中未被回收的對象被轉移到tenured generation,然而tenured generation也會被填滿,最終觸發major collection(主回收),這次回收針對整個heap,由於涉及到大量對象,所以比minor collection慢得多。

  • 由於tenured generation的major collection較慢,所以tenured generation空間小於young generation的話,會造成頻繁的major collection,影響效率。

  • Heap中各generation空間的劃分:-Xmx=n指定最大heap空間,-Xms=n指定最小heap空間。在JVM初始化的時候,如果最小heap空間小於最大heap空間的話,JVM會把未用到的空間標註爲Virtual。

  • young generation中倖存的對象被轉移到tenured generation,但不幸的是concurrent collector線程在這裏進行major collection,而在回收任務結束前空間被耗盡了,這時將會發生Full Collections(Full GC),整個應用程序都會停止下來直到回收完成。Full GC是高負載生產環境的噩夢。

  • Strong Ref(強引用):通常我們編寫的代碼都是Strong Ref,於此對應的是強可達性,只有去掉強可達,對象才被回收。

  • Soft Ref(軟引用):對應軟可達性,只要有足夠的內存,就一直保持對象,直到發現內存吃緊且沒有Strong Ref時纔回收對象。一般可用來實現緩存,通過java.lang.ref.SoftReference類實現。

  • Weak Ref(弱引用):比Soft Ref更弱,當發現不存在Strong Ref時,立刻回收對象而不必等到內存吃緊的時候。通過java.lang.ref.WeakReference和java.util.WeakHashMap類實現。

  • Phantom Ref(虛引用):根本不會在內存中保持任何對象,你只能使用Phantom Ref本身。一般用於在進入finalize()方法後進行特殊的清理過程,通過 java.lang.ref.PhantomReference實現。

  • Shallow size就是對象本身佔用內存的大小,不包含對其他對象的引用,也就是對象頭加成員變量(不是成員變量的值)的總和。

  • Retained size是該對象自己的shallow size,加上從該對象能直接或間接訪問到對象的shallow size之和。

  • 數組的shallow heap和一般對象(非數組)不同,依賴於數組的長度和裏面的元素的類型,對數組求shallow heap,也就是求數組集合內所有對象的shallow heap之和,即數組的shallow heap和retained heap一樣。

這裏寫圖片描述這裏寫圖片描述

  • 從obj1入手,上圖中藍色節點代表僅僅只有通過obj1才能直接或間接訪問的對象。因爲可以通過GC Roots訪問,所以左圖的obj3不是藍色節點;而在右圖卻是藍色,因爲它已經被包含在retained集合內。所以對於左圖,obj1的retained size是obj1、obj2、obj4的shallow size總和;右圖的retained size是obj1、obj2、obj3、obj4的shallow size總和。obj2的retained size可以通過相同的方式計算。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章