JAVA內存泄漏

JAVA內存泄漏

內存泄露是指無用對象(再也不使用的對象)持續佔有內存或無用對象的內存得不到及時釋放,從而形成的內存空間的浪費稱爲內存泄露。內存泄露有時不嚴重且不易察覺,這樣開發者就不知道存在內存泄露,但有時也會很嚴重,會提示你Out of memory。java

###緣由: 長生命週期的對象持有短生命週期對象的引用就極可能發生內存泄露,儘管短生命週期對象已經再也不須要,可是由於長生命週期對象持有它的引用而致使不能被回收,這就是java中內存泄露的發生場景;數據庫

  • 靜態變量,集合類引發內存泄露
  • 當集合裏面的對象屬性被修改後,再調用remove()方法時不起做用
  • 監聽器
  • 各類鏈接,數據庫鏈接,網絡鏈接,io鏈接 (除非其顯式的調用了其close()方法將其鏈接關閉,不然是不會自動被GC 回收)
  • 內部類和外部模塊等的引用
  • 單例模式

###發現內存泄漏: 獲取服務器jvm某刻內存快照,下一步分析;服務器

  1. jstat -gc pid 能夠顯示gc的信息,查看gc的次數,及時間。 其中最後五項,分別是young gc的次數,young gc的時間,full gc的次數,full gc的時間,gc的總時間。 2.jstat -gccapacity pid 能夠顯示,VM內存中三代(young,old,perm)對象的使用和佔用大小, 如:PGCMN顯示的是最小perm的內存使用量,PGCMX顯示的是perm的內存最大使用量, PGC是當前新生成的perm內存佔用量,PC是但前perm內存佔用量。 其餘的能夠根據這個類推, OC是old內純的佔用量。 3.jstat -gcutil pid 統計gc信息統計。 4.jstat -gcnew pid 年輕代對象的信息。 5.jstat -gcnewcapacity pid 年輕代對象的信息及其佔用量。 6.jstat -gcold pid old代對象的信息。 7.stat -gcoldcapacity pid old代對象的信息及其佔用量。 8.jstat -gcpermcapacity pid perm對象的信息及其佔用量。 9.jstat -class pid 顯示加載class的數量,及所佔空間等信息。 10.jstat -compiler pid 顯示VM實時編譯的數量等信息。 11.stat -printcompilation pid 當前VM執行的信息。 一些術語的中文解釋: S0C:年輕代中第一個survivor(倖存區)的容量 (字節) S1C:年輕代中第二個survivor(倖存區)的容量 (字節) S0U:年輕代中第一個survivor(倖存區)目前已使用空間 (字節) S1U:年輕代中第二個survivor(倖存區)目前已使用空間 (字節) EC:年輕代中Eden(伊甸園)的容量 (字節) EU:年輕代中Eden(伊甸園)目前已使用空間 (字節) OC:Old代的容量 (字節) OU:Old代目前已使用空間 (字節) PC:Perm(持久代)的容量 (字節) PU:Perm(持久代)目前已使用空間 (字節) YGC:從應用程序啓動到採樣時年輕代中gc次數 YGCT:從應用程序啓動到採樣時年輕代中gc所用時間(s) FGC:從應用程序啓動到採樣時old代(全gc)gc次數 FGCT:從應用程序啓動到採樣時old代(全gc)gc所用時間(s) GCT:從應用程序啓動到採樣時gc用的總時間(s) NGCMN:年輕代(young)中初始化(最小)的大小 (字節) NGCMX:年輕代(young)的最大容量 (字節) NGC:年輕代(young)中當前的容量 (字節) OGCMN:old代中初始化(最小)的大小 (字節) OGCMX:old代的最大容量 (字節) OGC:old代當前新生成的容量 (字節) PGCMN:perm代中初始化(最小)的大小 (字節) PGCMX:perm代的最大容量 (字節)
    PGC:perm代當前新生成的容量 (字節) S0:年輕代中第一個survivor(倖存區)已使用的佔當前容量百分比 S1:年輕代中第二個survivor(倖存區)已使用的佔當前容量百分比 E:年輕代中Eden(伊甸園)已使用的佔當前容量百分比 O:old代已使用的佔當前容量百分比 P:perm代已使用的佔當前容量百分比 S0CMX:年輕代中第一個survivor(倖存區)的最大容量 (字節) S1CMX :年輕代中第二個survivor(倖存區)的最大容量 (字節) ECMX:年輕代中Eden(伊甸園)的最大容量 (字節) DSS:當前須要survivor(倖存區)的容量 (字節)(Eden區已滿) TT:持有次數限制 MTT :最大持有次數限制

12.其餘命令:jstat -gcutil 15469 1000 300網絡

S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 1.46 26.54 4.61 30.14 35 0.872 0 0.000 0.872
0.00 1.46 46.54 4.61 30.14 35 0.872 0 0.000 0.872
0.00 1.46 47.04 4.61 30.14 35 0.872 0 0.000 0.872
0.00 1.46 65.19 4.61 30.14 35 0.872 0 0.000 0.872
0.00 1.46 67.54 4.61 30.14 35 0.872 0 0.000 0.872
0.00 1.46 87.54 4.61 30.14 35 0.872 0 0.000 0.872
0.00 1.46 88.03 4.61 30.14 35 0.872 0 0.000 0.872
1.48 0.00 5.56 4.62 30.14 36 0.874 0 0.000 0.874
1000 表明多久間隔顯示一次,
100 表明顯示一次。
S0 — Heap上的 Survivor space 0 區已使用空間的百分比
S1 — Heap上的 Survivor space 1 區已使用空間的百分比
E — Heap上的 Eden space 區已使用空間的百分比
O — Heap上的 Old space 區已使用空間的百分比
P — Perm space 區已使用空間的百分比
YGC — 從應用程序啓動到採樣時發生 Young GC 的次數
YGCT– 從應用程序啓動到採樣時 Young GC 所用的時間(單位秒)
FGC — 從應用程序啓動到採樣時發生 Full GC 的次數
FGCT– 從應用程序啓動到採樣時 Full GC 所用的時間(單位秒)
GCT — 從應用程序啓動到採樣時用於垃圾回收的總時間(單位秒)

13.參考:JVM性能調優監控工具jvm

###經常使用工具工具

MemoryAnalyzer
VisualVM
Jconsole
相關文章
相關標籤/搜索