<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    MDA/MDD/TDD/DDD/DDDDDDD
    posts - 536, comments - 111, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    java內存泄漏筆記

    Posted on 2009-01-14 14:18 leekiang 閱讀(6063) 評論(2)  編輯  收藏 所屬分類: java
    利用jdk6查內存泄漏(見編寫對GC友好,又不泄漏的代碼)
    (1)jmap -dump:file=heap_file_name pid 會產生一個heap_file_name文件
    (2)jhat heap_file_name,然后打開瀏覽器http://localhost:7000/ 瀏覽。
    ?? 可看到里面顯示了運行的所有的類和實例及大小。平臺(例如tomcat)的不會包括在里面。
    (3)如果覺得不夠,還可以把heap_file_name文件加一個bin的后綴,然后讓Eclipse MAT來分析。看這里
    另外
    jps:與unix上的ps類似,用來顯示本地的java進程,可以查看本地運行著幾個java程序,并顯示他們的進程號。
    jinfo:的用處比較簡單,就是能輸出并修改運行時的java進程的運行參數。用法是jinfo -opt? pid 如:查看2788的MaxPerm大小可以用? jinfo -flag MaxPermSize 2788。
    jstat 也很有用,說明見這里


    3,
    SUN JDK所支持的典型選項以及說明:http: //java.sun.com/javase/technologies/hotspot/vmoptions.jsp 上面有很多選項
    -XX:-HeapDumpOnOutOfMemoryError 從jdk1.4.2 update 12 和java 5 update 7開始支持這個選項。

    4,
    關于jmap
    從JDK 5開始,SUN JDK開始提供JMap的工具。但是僅僅是實驗性質的,而且只有在solaris平臺上有。
    后來Jmap被反向移植到jdk 1.4.2_09。因為是實驗性質,所以jmap可能會出現dump失敗的情況。
    但是自從JDK 6之后,jmap的穩定性和可用性都沒問題了。請注意各個版本的jvm都要用自己版本的jmap,
    而jhat可以用于分析各個版本的jmap dump出來的文件。至于jhat用于分析1g以上的dump文件,
    我們有過多次在筆記本上的成功經歷,它對內存的要求可能并沒有那么高。
    http://space.itpub.net/27378/viewspace-521225

    5,J2SE6中使用jhat來分析內存堆
    http://hi.baidu.com/tister/blog/item/e7374482f4341ca70cf4d2e8.html

    6,Java內存溢出(OutOfMemory),內存分析相關工具
    http://uglytroll.ycool.com/post.3046111.html

    7,JDK中的好工具 jmap、jhat
    http://wangzaixiang.blogspot.com/2008/10/jdk-jmapjhat.html
    http://hi.baidu.com/zeorliu/blog/item/4f38989413601719d21b70d5.html

    8,SAP貢獻給eclipse基金會的MemoryAnalyzer,原來叫Java Memory Analysis
    能分析幾G的Memory Dump而不會內存溢出?
    http://www.eclipse.org/mat/
    可惜還是只支持jdk1.4.2 update 12 和java 5 update 7以上

    9,在一個方法里面的變量是不會引起內存泄露的。
    內存泄露都是發生在類變量和實例變量(且此實例被緩存、如單例模式)里。
    我建議你從HashMap、HashMap$Entry 入手查查。
    我也研究過一陣子的內存泄露問題,最終解決了。
    http://www.javaeye.com/topic/233080

    10,你遇到的是最理想的情況,但有時候,這種方法不能找到原因,只找到造成崩潰的點.就好比,
    一個HTTP 請求,沒有設置超時(對不起,默認是不超時,不知道為什么SUN要這樣設定),
    然后這條線程就卡在這里了,然后,這條線程里的一個堆棧被另一條線程放入內容,
    本來這些內容就是要這條閑線程去處理的,但是現在,這條線程卡住了,但是用你說的這種方法,
    絕對找不到造成內存泄露的原因是因為http不超時,一直卡在那里.

    我還有一個笨辦法做精細的內存分配比較:就是定期用pmap命令dump出來JVM進程的內存映射表,然后diff。
    http://www.javaeye.com/topic/256701

    11,http://calvin.javaeye.com/blog/91903
    ?java 不是有垃圾收集器了嗎?怎么還泄漏啊,唬我啊??
    ?? 嗯,此泄漏非比泄漏。C/C++的泄漏,是對象已不可到達,而內存又沒有回收,真正的內存黑洞。
    ?? 而Java的泄漏,則是因為各種原因,對象對應用已經無用,但一直被持有,一直可到達。
    ?? 總結原因無外乎幾方面:

    ?? 1). 被生命周期極長的集合類不當持有,號稱是Java內存泄漏的首因。
    ????? 這些集合類的生命周期通常極長,而且是一個輔助管理性質的對象,在一個業務事務運行完后,如果沒有將某個業務對象主動的從中清除的話,這個集合就會吃越來越多內存,可以用WeakReference,如WeakHashMap,使得它持有的對象不增加對象的引用數。
    ?? 2). Scope定義不對,這個很簡單了,方法的局部變量定義成類的變量,類的靜態變量等。
    ?? 3). 異常時沒有加finally{}來釋放某些資源,JDBC時代也是很普遍的事情。
    ?? 4). 另外一些我了解不深的原因,如:Swing里的Listener沒有顯式remove;內部類持有外部對象的隱式引用;Finalizers造成關聯對象沒有被及時清空等。
    ?

    搭車
    我的SQL調優公式T=S/V
    http://space.itpub.net/27378/viewspace-157789

    MetaWidget及SOA
    http://wangzaixiang.blogspot.com/2008/10/metawidget.html

    評論

    # re: java內存泄漏筆記  回復  更多評論   

    2009-11-07 08:41 by 繁體字
    內存泄漏 可真煩人! 查來查去,只查到string 類 暈死!

    # re: java內存泄漏筆記  回復  更多評論   

    2010-03-24 14:21 by 繁體字轉換器
    Java的一個重要優點就是通過垃圾收集器(Garbage Collection,GC)自動管理內存的回收,程序員不需要通過調用函數來釋放內存。
    主站蜘蛛池模板: 在线观看免费视频资源| 韩国18福利视频免费观看| 亚洲国产av高清无码| 午夜dj在线观看免费视频| 国产97视频人人做人人爱免费| 久久亚洲sm情趣捆绑调教| 国产精品成人无码免费| 在线播放免费人成毛片乱码| 亚洲最大成人网色香蕉| 黑人大战亚洲人精品一区| 欧美大尺寸SUV免费| 在线免费观看h片| 亚洲综合av一区二区三区| 国产亚洲无线码一区二区| 成人午夜18免费看| 免费人成毛片动漫在线播放| 欧美亚洲国产SUV| 亚洲精品乱码久久久久久下载| 亚洲?V无码乱码国产精品| www视频免费看| 中国一级全黄的免费观看| 亚洲综合av一区二区三区不卡| 久久亚洲国产精品| 亚洲精品tv久久久久| 一二三四影视在线看片免费| 中文字幕免费不卡二区 | 免费激情网站国产高清第一页| 亚洲a在线视频视频| 亚洲福利视频一区二区| 成人最新午夜免费视频| 污污网站免费观看| 91成人免费福利网站在线| 美女黄色免费网站| 亚洲人成色77777在线观看| 精品亚洲成a人片在线观看 | 中文字幕在线日亚洲9| 亚洲2022国产成人精品无码区| 亚洲一区二区三区无码影院| 成**人免费一级毛片| 在线观看日本免费a∨视频| 97免费人妻在线视频|