java PreparedStatement造成記憶體流失 的解決方案,preparedstatement
最近用java寫一個資料庫程式,發現運行一段時間後總會出現記憶體溢出。想用記憶體監控工具查看一下是哪裡記憶體流失了,於是上網查看了一下,看到了jmap工具。
jmap工具
jmap列印出某個java進程(使用pid)記憶體內的,所有‘對象’的情況(如:產生那些對象,及其數量)。
可以輸出所有記憶體中對象的工具,甚至可以將VM 中的heap,以二進位輸出成文本。使用方法 jmap -histo pid。如果連用SHELL jmap -histo pid>a.log可以將其儲存到文本中去,在一段時間後,使用文本對比工具,可以對比出GC回收了哪些對象。jmap -dump:format=b,file=outfile 3024可以將3024進程的記憶體heap輸出出來到outfile檔案裡,再配合MAT(記憶體分析工具(Memory Analysis Tool),使用參見:http://blog.csdn.net/fenglibing/archive/2011/04/02/6298326.aspx)或與jhat (Java Heap Analysis Tool)一起使用,能夠以映像的形式直觀的展示當前記憶體是否有問題。
64位機上使用需要使用如下方式:
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.
(可能是產生core dump的java可執行程式)
core 將被列印資訊的core dump檔案
remote-hostname-or-IP 遠程debug服務的主機名稱或ip
server-id 唯一id,假如一台主機上多個遠程debug服務
2)基本參數:
-dump:[live,]format=b,file=<filename> 使用hprof二進位形式,輸出jvm的heap內容到檔案=. live子選項是可選的,假如指定live選項,那麼只輸出活的對象到檔案.
-finalizerinfo 列印正等候回收的對象的資訊.
-heap 列印heap的概要資訊,GC使用的演算法,heap的配置及wise heap的使用方式.
-histo[:live] 列印每個class的執行個體數目,記憶體佔用,類全名資訊. VM的內部類名字開頭會加上首碼”*”. 如果live子參數加上後,只統計活的對象數量.
-permstat 列印classload和jvm heap長久層的資訊. 包含每個classloader的名字,活潑性,地址,父classloader和載入的class數量. 另外,內部String的數量和佔用記憶體數也會列印出來.
-F 強迫.在pid沒有相應的時候使用-dump或者-histo參數. 在這個模式下,live子參數無效.
-h | -help 列印輔助資訊
-J 傳遞參數給jmap啟動的jvm.
pid 需要被列印配相資訊的java進程id,創業與打工的區別 - 博文預覽,可以用jps查問.
我是用jmap -histo pid 查看java程式中哪些對象記憶體溢出的,然後自己再對造成記憶體溢出的對象代碼進行review。
參考: