最近用java寫1個(gè)數(shù)據(jù)庫(kù)程序,發(fā)現(xiàn)運(yùn)行1段時(shí)間后總會(huì)出現(xiàn)內(nèi)存溢出。想用內(nèi)存監(jiān)控工具查看1下是哪里內(nèi)存泄漏了,因而上網(wǎng)查看了1下,看到了jmap工具。
我是用jmap -histo pid 查看java程序中哪些對(duì)象內(nèi)存溢出的,發(fā)現(xiàn)preparedStatement占用的內(nèi)存延續(xù)增加。然后自己再對(duì)造成內(nèi)存溢出的對(duì)象代碼進(jìn)行review,原來(lái)是preparedStatement和ResultSet對(duì)象未關(guān)閉釀成的。
下面扼要介紹1下jmap工具。
可以輸出所有內(nèi)存中對(duì)象的工具,乃至可以將VM 中的heap,以2進(jìn)制輸出成文本。使用方法 jmap -histo pid。如果連用SHELL jmap -histo pid>a.log可以將其保存到文本中去,在1段時(shí)間后,使用文本對(duì)照工具,可以對(duì)照出GC回收了哪些對(duì)象。jmap -dump:format=b,file=outfile 3024可以將3024進(jìn)程的內(nèi)存heap輸出出來(lái)到outfile文件里,再配合MAT(內(nèi)存分析工具(Memory Analysis Tool),使用參見:http://blog.csdn.net/fenglibing/archive/2011/04/02/6298326.aspx)或與jhat (Java Heap Analysis Tool)1起使用,能夠以圖象的情勢(shì)直觀的展現(xiàn)當(dāng)前內(nèi)存是不是有問題。
64位機(jī)上使用需要使用以下方式:
jmap -J-d64 -heap pid
SYNOPSIS
jmap [ option ] pid
jmap [ option ] executable core
jmap [ option ] [server-id@]remote-hostname-or-IP
1)options:
executable Java executable from which the core dump was produced.
(多是產(chǎn)生core dump的java可履行程序)
core 將被打印信息的core dump文件
remote-hostname-or-IP 遠(yuǎn)程debug服務(wù)的主機(jī)名或ip
server-id 唯1id,假設(shè)1臺(tái)主機(jī)上多個(gè)遠(yuǎn)程debug服務(wù)
2)基本參數(shù):
-dump:[live,]format=b,file=<filename> 使用hprof2進(jìn)制情勢(shì),輸出jvm的heap內(nèi)容到文件=. live子選項(xiàng)是可選的,假設(shè)指定live選項(xiàng),那末只輸出活的對(duì)象到文件.
-finalizerinfo 打印正等候回收的對(duì)象的信息.
-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情況.
-histo[:live] 打印每一個(gè)class的實(shí)例數(shù)目,內(nèi)存占用,類全名信息. VM的內(nèi)部類名字開頭會(huì)加上前綴”*”. 如果live子參數(shù)加上后,只統(tǒng)計(jì)活的對(duì)象數(shù)量.
-permstat 打印classload和jvm heap久長(zhǎng)層的信息. 包括每一個(gè)classloader的名字,活潑性,地址,父classloader和加載的class數(shù)量. 另外,內(nèi)部String的數(shù)量和占用內(nèi)存數(shù)也會(huì)打印出來(lái).
-F 逼迫.在pid沒有相應(yīng)的時(shí)候使用-dump或-histo參數(shù). 在這個(gè)模式下,live子參數(shù)無(wú)效.
-h | -help 打印輔助信息
-J 傳遞參數(shù)給jmap啟動(dòng)的jvm.
pid 需要被打印配相信息的java進(jìn)程id,創(chuàng)業(yè)與打工的區(qū)分 - 博文預(yù)覽,可以用jps查問.