日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Eclipse Memory Analyzer以及内存泄露的原因

發布時間:2024/9/27 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Eclipse Memory Analyzer以及内存泄露的原因 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Eclipse Memory Analyzer是一個非常棒的堆內存分析工具,是JDK自帶的堆分析工具jhat的一個非常好的替代品,能夠快速地定位Java內存泄露的原因。
????? 可能有的同學會問,JVM不是號稱自動內存管理,GC會自動垃圾回收,Java怎么會有內存泄露,不會搞錯吧?當然不會^_^, Java的內存泄露不同于C/C++的內存泄露,C/C++的內存泄露是由于使用了堆內存(new/malloc)卻沒有釋放(delete/free),導致無法再使用到該內存片,而Java的內存泄露是無謂地引用了一些垃圾的對象,譬如我們有一個Map對象,不斷往里面放對象,實際的場景可能是這些對象不會再被使用到,這時候,這部分數據本身是垃圾的(因為不會再被使用),但實際上JVM會不會釋放它(因為還被Map)引用著,這就是Java的內存泄露。
????? 在開始分析之前,我們先想想,在編程這個角度上,我們如何避免堆內存泄露呢?實際上java.lang.ref這個包已經為我們提供了一種問題解決方案。Java的引用有4種:強引用(Strong Reference)、軟引用(Soft Reference)、弱引用(Weak Reference)、幻影引用(Phantom Reference),關于這部分介紹的文章一大批,此處就不做深入,我們只需要知道如下的信息:

  • 強引用:除非將引用置為null,否則JVM不會對它垃圾,這是最常用的引用方式
  • 軟引用:在堆內存不足的時候,GC會將其垃圾回收
  • 弱引用:每次GC都會將其垃圾回收
  • 幻影引用:跟沒有引用一樣,每次獲得的都是空的,沒有太多使用的意義,僅是為了追蹤對象在JVM的狀態

????? 一般對于大數據量的Cache信息或大對象,使用軟引用/弱引用是一種非常好的習慣,或者至少使用一種淘汰算法,避免在堆內存擁擠大量的對象導致內存不足,如下是兩個非常好的JDK默認提供的HashMap替代者:

  • org.apache.commons.collections.map.ReferenceMap:支持強引用/軟引用和弱引用來存儲key/value對
  • org.apache.commons.collections.map.LRUMap:可以控制總容量,采用LRU淘汰算法,將不常使用的數據淘汰出去

?????? 介紹完一些背景,我們開始進入主題。在開始分析之前,我們需要先dump下JVM的堆內存信息(雖然Eclipse Memory Analyzer直接attach到JVM上獲取棧再分析,實際應用價值不大)

jmap –dump:file=test.bin {pid}

???? 現在我們有了test.bin這個堆文件,使用Eclipse Memory Analyzer打開,分析完堆,我們可以選擇“Leak Suspects Report”進行內存泄露分析。通過這個視圖,我們可以大概得到內存泄露的初步結論
?
???? Historygram也是一個非常常用的視圖,可以獲得堆中對象的數據統計,有排序、過濾的功能,非常好用
?
?????? Eclipse Memory Analyzer還包括如下功能:

  • 在Historygram視圖中右擊對象彈出的功能框中,可以獲得對象相互引用的關系的功能
  • Dominator Tree的視圖采用Tree的方式來展現整個棧對象相互引用的情況
  • OQL視圖支持使用OQL語言來查詢對象信息

總結

以上是生活随笔為你收集整理的Eclipse Memory Analyzer以及内存泄露的原因的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。