無為

          無為則可為,無為則至深!

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            190 Posts :: 291 Stories :: 258 Comments :: 0 Trackbacks

          為了分析java應用的內存泄漏,使用thread dump往往解決不了問題。使用jstat【eg:jstat -gcutil pid 1000 5】工具查看運行的java應用的heap size,perm size ,survivor ratio等,當時你無法知道是什么對象把堆填滿了。

               什么是 Java heap dump

                首先需要搞懂什么是java heap,java heap是分配給實例類和數組對象運行數據區,所有java線程在運行期間共享heap中的數據。Java heap dump相當于java應用在運行的時候在某個時間點上打了個快照(snapshot)。

               如果你不懂啥是snapshot,點擊這里

               觸發 Java heap dump

          有以下方法出發heap dump

          1. 使用$JAVA_HOME/bin/jmap -dump來觸發,eg:jmap -dump:format=b,file=/home/longhao/heamdump.out <pid>
          2. 使用$JAVA_HOME/bin/jcosole中的MBean,到MBean>com.sun.management>HotSpotDiagnostic>操作>dumpHeap中,點擊 dumpHeap按鈕。生成的dump文件在java應用的根目錄下面。
          3. 在應用啟動時配置相關的參數 -XX:+HeapDumpOnOutOfMemoryError,當應用拋出OutOfMemoryError時生成dump文件。
          4. 使用hprof。啟動虛擬機加入-Xrunhprof:head=site,會生成java.hprof.txt文件。該配置會導致jvm運行非常的慢,不適合生產環境。


               分析 Java heap dump

               1:使用IBM HeapAnalyzer

              IBM HeapAnalyzer是一款免費的JVM內存堆的圖形分析工具,它可以有效的列舉堆的內存使用狀況,幫助分析Java內存泄漏的原因。

              下載解壓后有一個ha413.jar,執行: java -Xmx512m -jar ha413.jar /home/longhao/heapdump.out

               執行結果如圖所示:


             

               2:jhat

              jhat(Java Head Analyse Tool )是用來分析java堆的命令,可以將堆中的對象以html的形式顯示出來,包括對象的數量,大小等等,并支持對象查詢語言OQL,分析相關的應用后,可以通過http://localhost:7000來訪問分析結果。

              示例: $JAVA_HOME/bin/jhat -J-Xmx512m /home/longhao/dump.out


               3:Eclipse MemoryAnalyzer

              Eclipse Memory Analyzer是一個快速并且功能強大的Java heap分析器,能夠幫助你查找內存泄漏和減少內存消耗。在File>Acquire Heap Dump>configure>HPROF jmap dump provider設置一下分析應用的JDK,點擊相關應用列表來生成heap dump并分析。

              

              在socket,nio中的有些API中,申請的內存是直接向OS要的,在堆中分析內存是查看不到的,可以通過-XX:MaxDirectMemorySize=<size>來設置應用向OS直接申請的最大內存數。



          凡是有該標志的文章,都是該blog博主Caoer(草兒)原創,凡是索引、收藏
          、轉載請注明來處和原文作者。非常感謝。

          posted on 2011-10-04 22:31 草兒 閱讀(9460) 評論(0)  編輯  收藏 所屬分類: java
          主站蜘蛛池模板: 孟村| 沿河| 广水市| 丹棱县| 长岭县| 砚山县| 申扎县| 灵丘县| 无锡市| 宣化县| 东方市| 鄂托克前旗| 兰州市| 肇源县| 光山县| 宜黄县| 林芝县| 榕江县| 怀柔区| 柯坪县| 长泰县| 东阿县| 双牌县| 鄱阳县| 长宁区| 南投县| 玉门市| 榆林市| 凯里市| 招远市| 图们市| 鄂温| 全州县| 闽清县| 清徐县| 高唐县| 两当县| 沽源县| 古田县| 龙岩市| 江都市|