九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開(kāi)通VIP
線上應(yīng)用故障排查之二:高內(nèi)存占用

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

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

1、java.lang.OutOfMemoryError: PermGen space

2、java.lang.OutOfMemoryError: Java heap space

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

(友情提示:本博文章歡迎轉(zhuǎn)載,但請(qǐng)注明出處:hankchen,http://www.blogjava.net/hankchen

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

 

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

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

·jmap [pid]

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

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

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

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

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

 

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

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

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

 

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

1、top命令:Linux命令??梢圆榭磳?shí)時(shí)的內(nèi)存使用情況。  

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

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

(友情提示:本博文章歡迎轉(zhuǎn)載,但請(qǐng)注明出處:hankchen,http://www.blogjava.net/hankchen

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
jmap命令(Java Memory Map)
一次使用Eclipse Memory Analyzer分析Tomcat內(nèi)存溢出
[Java基礎(chǔ)] 使用JMAP dump及分析dump文件
用“逐步排除”的方法定位Java服務(wù)線上“系統(tǒng)性”故障
使用MAT(Memory Analyzer Tool)工具分析dump文件
java.lang.OutOfMemoryError的兩種解決辦法
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服