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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

java permgen内存泄漏问题处理

發(fā)布時(shí)間:2024/1/17 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java permgen内存泄漏问题处理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

來(lái)自:http://longtask.com/review/2014/06/07/java-permgen-outofmemory/

?

? ? 工作以來(lái),第三次出現(xiàn)內(nèi)存溢出,第一次是ThreadLocal沒(méi)有remove造成的問(wèn)題;第二次是ExecutorService沒(méi)有正確的shutdown造成的問(wèn)題;這一次的問(wèn)題在我出手排查之前,已經(jīng)知道了是permgen在不斷的增長(zhǎng),在permgen中主要有Class和Meta信息,常量。

????在開(kāi)始階段:排除了ThreadLocal可能導(dǎo)致的問(wèn)題;排除了Thread可能導(dǎo)致的問(wèn)題;后面就需要從新的突破點(diǎn)找問(wèn)題了。

???? 1:基本設(shè)置的排查

????查找日志中訪問(wèn)量較大的請(qǐng)求的URL:

awk '{print $6}' service-digest.* |awk -F"," '{print $1 ",""1"}'|awk -F"," '{a[$1]+=$2;b[$1]++}END{for(n in a)print a[n] " " n }'|sort -n
????查找日志中的調(diào)用很多的內(nèi)容;依然沒(méi)有發(fā)現(xiàn)問(wèn)題;采用webbench一個(gè)個(gè)的調(diào)用請(qǐng)求來(lái)模擬操作,前十名的URL沒(méi)有發(fā)現(xiàn)問(wèn)題,后面的就沒(méi)有查看了。

?

????通過(guò)線下操作,發(fā)現(xiàn)也不是開(kāi)始懷疑的RMI遠(yuǎn)程調(diào)用的問(wèn)題;

????針對(duì)CMS-GC,網(wǎng)上建議開(kāi)通?-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled?,好吧,我們一開(kāi)始就是開(kāi)通的。參考:permgen-out-of-memory-reasons

???? 2:內(nèi)存使用情況

????2.1:查看內(nèi)存使用情況

jmap -heap pid

????2.2:查看permsize的命令

jmap -heap `ps -ef | grep java | grep -v grep` | awk 'NR==44,NR==48'

????2.3:觸發(fā)full gc :

jmap -histo:live pid

???? 2.4:不斷的觸發(fā)full GC 每10分鐘觀察一下內(nèi)存的變化情況

PID=`ps -ef | grep java | grep uic | awk '{print $2}'`?
for((i=1;i<10000;i++));do?
jmap -histo:live ${PID} > /tmp/fullgc.log?
jmap -heap ${PID} | awk "NR==42,NR==48" >> heap.log?
echo $i?
sleep 600?
done?

????2.5:觀察一段時(shí)間后(5個(gè)小時(shí)),分析相關(guān)的permsize的內(nèi)存增長(zhǎng)情況

awk '{if(NR%7==0) print $0}' heap.log

???? 3:查看perm中的情況

jmap -permstat pid

????查詢的結(jié)果類似一下情況:

0x00000000ce58bb18 1 3200 0x00000000cc02c030 dead sun/reflect/DelegatingClassLoader@0x00000000f4067700?
0x00000000cec33d48 1 3088 0x00000000cc02c030 dead sun/reflect/DelegatingClassLoader@0x00000000f4067700?
0x00000000ce39c8b0 1 1944 0x00000000cc02c030 dead sun/reflect/DelegatingClassLoader@0x00000000f4067700?
0x00000000ce8ab270 1 3104 null dead sun/reflect/DelegatingClassLoader@0x00000000f4067700?
0x00000000ceb1d108 1 3104 0x00000000cc02c030 dead sun/reflect/DelegatingClassLoader@0x00000000f4067700?

total = 1600 11325 60491768 N/A alive=1, dead=1599 N/A

????不是反射的問(wèn)題。(dead sun/reflect/DelegatingClassLoader)

???? 4:查看JDK的相關(guān)垃圾回收情況

????我們使用了CMS GC,過(guò)程中發(fā)現(xiàn)的GC日志看不出任何問(wèn)題。

????PS:未來(lái)我們找個(gè)時(shí)間專門(mén)討論一下CMS GC的過(guò)程,方便我們?cè)谖磥?lái)的垃圾處理過(guò)程中找到更加合理的方法去處理問(wèn)題。

???? 5:查看perm中的類加載情況

????在啟動(dòng)的腳本中打開(kāi)-verbose:class來(lái)查看運(yùn)行的過(guò)程中到底多少個(gè)類被加載了。【verbose和verbose:class意義相同, 還有-verbose:gc, -verbose:jni】

JAVA_OPTS="${JAVA_OPTS} -verbose:class"

????啟動(dòng)腳本中把輸出內(nèi)容從?/dev/null 2>&1 &?修改為?>${PWD}/jvm.log

????我們通過(guò)jvm的日志發(fā)現(xiàn)如下奇怪的日志:

[Loaded com.hqb360.uic.dao.point.entity.BonusPointDetail$$BulkBeanByCGLIB$$5a972456_249 from file:/opt/jetty/work/jetty-0.0.0.0-8080-uic.war-_uic-any-/webapp/WEB-INF/lib/cglib-2.2.2.jar]
[Loaded com.hqb360.uic.dao.point.entity.BonusPointDetail$$BulkBeanByCGLIB$$5a972456_250 from file:/opt/jetty/work/jetty-0.0.0.0-8080-uic.war-_uic-any-/webapp/WEB-INF/lib/cglib-2.2.2.jar]
[Loaded com.hqb360.uic.dao.point.entity.BonusPointDetail$$BulkBeanByCGLIB$$5a972456_251 from file:/opt/jetty/work/jetty-0.0.0.0-8080-uic.war-_uic-any-/webapp/WEB-INF/lib/cglib-2.2.2.jar]
[Loaded com.hqb360.uic.dao.point.entity.BonusPointDetail$$BulkBeanByCGLIB$$5a972456_252 from file:/opt/jetty/work/jetty-0.0.0.0-8080-uic.war-_uic-any-/webapp/WEB-INF/lib/cglib-2.2.2.jar]
[Loaded com.hqb360.uic.dao.point.entity.BonusPointDetail$$BulkBeanByCGLIB$$5a972456_253 from file:/opt/jetty/work/jetty-0.0.0.0-8080-uic.war-_uic-any-/webapp/WEB-INF/lib/cglib-2.2.2.jar]
[Loaded com.hqb360.uic.dao.point.entity.BonusPointDetail$$BulkBeanByCGLIB$$5a972456_254 from file:/opt/jetty/work/jetty-0.0.0.0-8080-uic.war-_uic-any-/webapp/WEB-INF/lib/cglib-2.2.2.jar]
[Loaded com.hqb360.uic.dao.point.entity.BonusPointDetail$$BulkBeanByCGLIB$$5a972456_255 from file:/opt/jetty/work/jetty-0.0.0.0-8080-uic.war-_uic-any-/webapp/WEB-INF/lib/cglib-2.2.2.jar]

????uic.dao.point.entity.BonusPointDetail的類一直在perm中增加,每次都在復(fù)制,沒(méi)有重用,也沒(méi)有被垃圾回收。問(wèn)題基本就定位到這個(gè)地方。

???? 6:找出問(wèn)題的具體原因

????6.1:去掉類中的反射,發(fā)現(xiàn)問(wèn)題沒(méi)有解決。空歡喜了一場(chǎng)!!!!

????6.2:反復(fù)的測(cè)試調(diào)用的頁(yè)面,發(fā)現(xiàn)在插入操作的過(guò)程中,會(huì)出現(xiàn)步驟5中perm class日志的情況。針對(duì)

INSERT INTO bonus_point_detail (<isNotEmpty property="id">id,</isNotEmpty>……gmt_created,gmt_modified)VALUES (<isNotEmpty property="id">#id#,</isNotEmpty>……now(),now())

????這樣的情況,我們修改為:

INSERT INTO bonus_point_detail (id,……gmt_created,gmt_modified)VALUES (#id#,……now(),now())

????后續(xù)測(cè)試一下,發(fā)現(xiàn)問(wèn)題解決,permgen不再持續(xù)增長(zhǎng);當(dāng)某個(gè)內(nèi)容寫(xiě)操作比較多的時(shí)候,直接導(dǎo)致permgen里面有大量的類消息,從而導(dǎo)致了內(nèi)存溢出。

????待處理:我們將下次討論為什么不能在insert的時(shí)候使用isNotEmpty的問(wèn)題。

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的java permgen内存泄漏问题处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。