Java內存分析


今天工作需要測試一段代碼是否有效執行了對象的回收,期間使用了java內存分析工具等,總結知識點。

  • jmap
  • jstat
  • jhat
  • mat
  • java 內存模型
  • java GC

Jmap

生成堆快照

  • jmap -heap :當前堆內存分布信息,如From space, To Space等占用內存大小
  • jmap -histo : 當前堆中對象占用內存大小情況,柱狀圖數據結構組織。可以簡單得定位下當前占用內存最大的幾個對象
  • jmap -histo:live:先觸發一次gc , 再統計對象占用內存情況。可以簡單得定位下當前占用內存最大的幾個對象以及對象是否可以被gc回收
  • jmap -dump:format=b,file=heapDump: 導出堆詳細使用信息,b表示二進制文件,之后采用其他工具分析,如jhat,mat.非常詳細,可分析到對象之間的引用關系等。

Jstat

顯示進程中的類裝載、內存、垃圾收集、JIT編譯等運行數據
目前感覺用上的都是gc記錄查看,實際還沒太用過

  • jstat -gc 3331 250 20: 查詢進程2764的垃圾收集情況,每250毫秒查詢一次,一共查詢20次。
  • jstat- gcause

Jhat

可用來分析 jmap dump生成的堆信息二進制文件。html形式顯示對象占用內存大小以及引用情況,但顯示得并不友好。感覺比較雞肋。

  • jhat file

mat

eclipse提供的jvm 內存分析工具,圖形化界面,很好用。 可分析引用(出度,入度),引用的內容等,強烈推薦,idea不帶這種插件,可以單獨下。如果要分析的堆文件太大,可能oom,需要修改MemoryAnalyzer.ini 里啟動的jvm參數。

java 內存模型

如圖

內存模型.png

至于oom以及相應的jvm參數,還有很多細節。Jdk 1.8中已經刪除了perSize相關參數。oom什么情況下會產生,跟gc的方式也相關。后續繼續。

java GC

在oom試驗中,設置了perSize=10m maxPerSize=10m ,通過string.intern循環產生string常量,卻一直沒有perm gen oom.查看jmap -heap ,發現內存中ps old gen 已經600M+, per gen 2m+.為什么?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容