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

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

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

    經(jīng)驗不在于年限,在于積累---專注互聯(lián)網(wǎng)軟件開發(fā)

    把工作當事業(yè)做,把項目當作品做!

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      55 Posts :: 0 Stories :: 66 Comments :: 0 Trackbacks

    前一篇介紹了線上應用故障排查之一:高CPU占用,這篇主要分析高內(nèi)存占用故障的排查。

    搞Java開發(fā)的,經(jīng)常會碰到下面兩種異常:

    1、java.lang.OutOfMemoryError: PermGen space

    2、java.lang.OutOfMemoryError: Java heap space

    要詳細解釋這兩種異常,需要簡單重提下Java內(nèi)存模型。

    (友情提示:本博文章歡迎轉(zhuǎn)載,但請注明出處:hankchen,http://m.tkk7.com/hankchen

    Java內(nèi)存模型是描述Java程序中各變量(實例域、靜態(tài)域和數(shù)組元素)之間的關(guān)系,以及在實際計算機系統(tǒng)中將變量存儲到內(nèi)存和從內(nèi)存取出變量這樣的低層細節(jié)。

    在Java虛擬機中,內(nèi)存分為三個代:新生代(New)、老生代(Old)、永久代(Perm)。

    (1)新生代New:新建的對象都存放這里

    (2)老生代Old:存放從新生代New中遷移過來的生命周期較久的對象。新生代New和老生代Old共同組成了堆內(nèi)存。

    (3)永久代Perm:是非堆內(nèi)存的組成部分。主要存放加載的Class類級對象如class本身,method,field等等。

    如果出現(xiàn)java.lang.OutOfMemoryError: Java heap space異常,說明Java虛擬機的堆內(nèi)存不夠。原因有二:

    (1)Java虛擬機的堆內(nèi)存設置不夠,可以通過參數(shù)-Xms、-Xmx來調(diào)整。

    (2)代碼中創(chuàng)建了大量大對象,并且長時間不能被垃圾收集器收集(存在被引用)。

    如果出現(xiàn)java.lang.OutOfMemoryError: PermGen space,說明是Java虛擬機對永久代Perm內(nèi)存設置不夠。

    一般出現(xiàn)這種情況,都是程序啟動需要加載大量的第三方jar包。例如:在一個Tomcat下部署了太多的應用。

     

    從代碼的角度,軟件開發(fā)人員主要關(guān)注java.lang.OutOfMemoryError: Java heap space異常,減少不必要的對象創(chuàng)建,同時避免內(nèi)存泄漏。

    現(xiàn)在以一個實際的例子分析內(nèi)存占用的故障排查。

    2G19({7(0}N(FIL09LH175N

    通過top命令,發(fā)現(xiàn)PID為9004的Java進程一直占用比較高的內(nèi)存不釋放(24.7%),出現(xiàn)高內(nèi)存占用的故障。

    想起上一篇線上應用故障排查之一:高CPU占用介紹的PS命令,能否找到具體是哪個的線程呢?

    ps -mp 9004 -o THREAD,tid,time,rss,size,%mem

    1

    遺憾的是,發(fā)現(xiàn)PS命令可以查到具體進程的CPU占用情況,但是不能查到一個進程下具體線程的內(nèi)存占用情況。

     

    只好尋求其他方法了,幸好Java提供了一個很好的內(nèi)存監(jiān)控工具:jmap命令

    jmap命令有下面幾種常用的用法:

    ?jmap [pid]

    ?jmap -histo:live [pid] >a.log

    ?jmap -dump:live,format=b,file=xxx.xxx [pid]

    用得最多是后面兩個。其中,jmap -histo:live [pid] 可以查看當前Java進程創(chuàng)建的活躍對象數(shù)目和占用內(nèi)存大小。

    jmap -dump:live,format=b,file=xxx.xxx [pid] 則可以將當前Java進程的內(nèi)存占用情況導出來,方便用專門的內(nèi)存分析工具(例如:MAT)來分析。

    這個命令對于分析是否有內(nèi)存泄漏很有幫助。具體怎么使用可以查看本博的另一篇文章:利用Eclipse Memory Analyzer Tool(MAT)分析內(nèi)存泄漏

     

    這里詳細介紹下jmap -histo:live [pid] 命令:

    1

    從上圖可以看出,int數(shù)組、constMethodKlass、methodKlass、constantPoolKlass都占用了大量的內(nèi)存。

    特別是占用了大量內(nèi)存的int數(shù)組,需要仔細檢查相關(guān)代碼。

     

    最后,總結(jié)下排查內(nèi)存故障的方法和技巧有哪些:

    1、top命令:Linux命令。可以查看實時的內(nèi)存使用情況。  

    2、jmap -histo:live [pid],然后分析具體的對象數(shù)目和占用內(nèi)存大小,從而定位代碼。

    3、jmap -dump:live,format=b,file=xxx.xxx [pid],然后利用MAT工具分析是否存在內(nèi)存泄漏等等。

    (友情提示:本博文章歡迎轉(zhuǎn)載,但請注明出處:hankchen,http://m.tkk7.com/hankchen

    posted on 2012-05-09 20:21 hankchen 閱讀(12992) 評論(2)  編輯  收藏 所屬分類: 工作感悟

    Feedback

    # re: 線上應用故障排查之二:高內(nèi)存占用 2015-08-24 09:14 zhm
    ps -mp 9004 -o THREAD,tid,time,rss,size,%mem
    你上面pid是9004,下面的pid 2809從哪里來?
    jmap -histo:live 2809|head -n 100  回復  更多評論
      

    # re: 線上應用故障排查之二:高內(nèi)存占用 2015-12-22 17:55 路人
    @zhm
    上面是PID下面是[pid]  回復  更多評論
      

    主站蜘蛛池模板: 亚洲伊人久久综合中文成人网| xx视频在线永久免费观看| 亚洲乱色熟女一区二区三区蜜臀| 国产AV旡码专区亚洲AV苍井空 | 免费播放特黄特色毛片| 亚洲成a人片在线观看老师| 亚洲国产成人片在线观看| 2020年亚洲天天爽天天噜| fc2免费人成为视频| 久久这里只精品99re免费| 天天操夜夜操免费视频| 在线观看国产区亚洲一区成人| 337p日本欧洲亚洲大胆精品555588| 亚洲精品国产suv一区88| 午夜不卡久久精品无码免费| 大学生美女毛片免费视频| 亚洲人成网站色7799| 国产一区二区三区免费视频| 亚洲国产成人久久精品app| 日韩大片在线永久免费观看网站| 5555在线播放免费播放| 亚洲人成影院在线观看| 中文字幕乱码免费看电影| 青青草国产免费久久久下载| 亚洲制服中文字幕第一区| 国产免费A∨在线播放| 国产免费资源高清小视频在线观看| 国产成人亚洲综合在线| 免费精品国产自产拍在线观看图片| 亚洲香蕉成人AV网站在线观看| 亚洲AV香蕉一区区二区三区| 日本成年免费网站| 亚洲aⅴ天堂av天堂无码麻豆| 国产精品亚洲玖玖玖在线观看| 亚洲欧美日韩综合久久久久| 亚洲精品国产电影| 一级毛片完整版免费播放一区| 凹凸精品视频分类国产品免费| 永久免费不卡在线观看黄网站| 精品久久久久久亚洲| 无遮挡国产高潮视频免费观看|