java 內存管理

  1. java 內存模型 

    0_1323226739SNiN.gif

    如上圖,每個java線程有自己的pc registers和java stacks

    進程內的所有的java線程共享method area和heap

    method area也就是java的持久代

  2. 再來看下heap的結構

    1336185793_9775.jpg

    具體的規則一堆一堆的,不再贅述

  3. 如何定位內存泄露呢?

    先看一些常用的命令:

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內存佔用量。

           其他的可以根據這個類推, OCold內純的佔用量。

     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)中當前的容量 (字節)

       OGCMNold代中初始化(最小)的大小 (字節

       OGCMXold代的最大容量 (字節)

        OGCold代當前新生成的容量 (字節)

       PGCMNperm代中初始化(最小)的大小 (字節

       PGCMXperm代的最大容量 (字節)   

         PGCperm代當前新生成的容量 (字節)

         S0:年輕代中第一個survivor(倖存區)已使用的佔當前容量百分比

          S1:年輕代中第二個survivor(倖存區)已使用的佔當前容量百分比

         E:年輕代中Eden(伊甸園)已使用的佔當前容量百分比

         Oold代已使用的佔當前容量百分比

         Pperm代已使用的佔當前容量百分比

       S0CMX:年輕代中第一個survivor(倖存區)的最大容量 (字節)

       S1CMX :年輕代中第二個survivor(倖存區)的最大容量 (字節)

        ECMX:年輕代中Eden(伊甸園)的最大容量 (字節)

         DSS:當前需要survivor(倖存區)的容量 (字節)Eden區已滿)

          TT持有次數限制

         MTT 最大持有次數限制


舉個例子:

執行: jstat -gcutil 15469  1000 300  如果大量有fullgc , 說明可能有內存泄露

          或者vmstat,top 看內存的增長情況

代碼定位:

MemoryAnalyzer.exe, jprofiler   來分析dump文件即可,一般就是map之類的容器


來看兩個內存泄露的例子:

a . 想象一個生產消費問題,  不停的有大量事件發送過來,  消費處理很慢,  事件不停堆積產生內存增長

b. 待研究:

http://wiki.apache.org/tomcat/MemoryLeakProtection

threadlocal  弱引用



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