Java內存分析簡單介紹

原創:轉載需註明原創地址 https://www.cnblogs.com/fanerwei222/p/11904422.html

Java內存分析簡單介紹:html

1. # 設置內存溢出時自動生成堆內存快照信息 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\log\gc.hprof -XX:+PrintGCDetails -Xloggc:D:\log\gc.log 2. 使用Jmap(Java Memory Map) 生成 堆內存信息文件 HeapDump, 打印指定Java進程(或核心文件、遠程調試服務器)的共享對象內存映射或堆內存細節 常見內存錯誤: outOfMemoryError 年代內存不足。 outOfMemoryError:PermGen Space 永久代內存不足。 outOfMemoryError:GC overhead limit exceed 垃圾回收時間佔用系統運行時間的98%或以上。 jmap -dump:live,format=b,file=d:/log/heapdump.hprof 1000 能夠將1000進程的內存heap輸出出來到d:\log\heapdump.hprof文件裏; 用 MAT 分析: Histogram能夠列出內存中的對象,對象的個數以及大小。 Dominator Tree能夠列出那個線程,以及線程下面的那些對象佔用的空間。 Top consumers經過圖形列出最大的object。 Leak Suspects經過MA自動分析泄漏的緣由。 Histogram: Class Name : 類名稱,java類名 Objects : 類的對象的數量,這個對象被建立了多少個 Shallow Heap :一個對象內存的消耗大小,不包含對其餘對象的引用 Retained Heap :是shallow Heap的總和,也就是該對象被GC以後所能回收到內存的總和 Shallow Size 對象自身佔用的內存大小,不包括它引用的對象。 針對非數組類型的對象,它的大小就是對象與它全部的成員變量大小的總和。固然這裏面還會包括一些java語言特性的數據存儲單元。 針對數組類型的對象,它的大小是數組元素對象的大小總和。 Retained Size Retained Size=當前對象大小+當前對象可直接或間接引用到的對象的大小總和。(間接引用的含義:A->B->C, C就是間接引用) 換句話說,Retained Size就是當前對象被GC後,從Heap上總共能釋放掉的內存。 不過,釋放的時候還要排除被GC Roots直接或間接引用的對象。他們暫時不會被被當作Garbage GC ROOTS |
        |--ObjectA |--ObjectB |----|--ObjectC |----|--ObjectD |--ObjectD 能夠看出, GC ROOTS直接引用了 A, B, D 三個對象: A : Retained Size(A) = Shallow Size(A) B : Retained Size(B) = Shallow Size(B) + Shallow Size(C) (此處由於D直接被GCROOTS引用, 因此這裏不包含D) D : Retained Size(D) = Shallow Size(D) 若是D不被GC ROOTS直接引用以下: GC ROOTS |
        |--ObjectA |--ObjectB |----|--ObjectC |----|--ObjectD A : Retained Size(A) = Shallow Size(A) B : Retained Size(B) = Shallow Size(B) + Shallow Size(C) + Shallow Size(D) D : Retained Size(D) = Shallow Size(D)
相關文章
相關標籤/搜索