JVM 方法區內存擴大 以及開啟GC


因為應用使用了OSGi框架,《深入理解JAVA虛擬機》中對使用OSGi時可能產生的方法區溢出有所描述

第一部分:

第二部分

 

可見,OSGi會動態生成大量Class,在OSGi中,即使是同一個類文件,被不同的加載器加載也會視為不同的類。

因此方法區在默認比較小的情況下,可能會溢出,實際上也確實遇到了

 

 

我計划的解決方法

1.確認Linux物理內存大小,free -h

2.確認JDK版本,已確認是64位的 JDK1.6

hotspot1.6中,整個JVM堆內存大小=Xmx=年輕代大小 + 老年代大小。持久代(也就是方法區)要另外算,默認大小是64M(64位JVM由於指針膨脹,默認是85M)

永久代是一片連續的堆空間,在JVM啟動之前通過在命令行設置參數-XX:MaxPermSize來設定永久代最大可分配的內存空間,當JVM加載的類信息容量超過了參數-XX:MaxPermSize設定的值時,應用將會報OOM的錯誤

 

3.修改啟動腳本

java -Xmx256m -XX:PermSize=128M -XX:MaxPermSize=256MB TestData.java

 

4.

// 查看當前機器上所有運行的java進程名稱與pid(進程編號)
jps -l 
// 顯示指定的jvm進程所有的屬性設置和配置參數
jinfo pid
// 查詢某個pid進程對應的應用程序內存占用情況
jmap -heap pid
// 顯示進程詳情
jstack pid
// jstat: 可以實時監測系統資源占用與jvm運行情況 (位於”jdk_home/bin”目錄下)
jstat -class -t 5940

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM