1. 程式人生 > 其它 >效能問題分析-OOM記憶體溢位

效能問題分析-OOM記憶體溢位

三種記憶體溢位異常介紹 1. OutOfMemoryError: Java heap space 堆溢位 記憶體溢位主要存在問題就是出現在這個情況中。當在JVM中如果98%的時間是用於GC且可用的 Heap size 不足2%的時候將丟擲此異常資訊。 jamp分析記憶體溢位 命令介紹:獲取java程序 heap 分配快照,物件統計資訊, dump 堆到hprof 二進位制檔案,供其他工具分析
jmap -heap  pid
jmap -histo pid 
jmap -histo pid > 1.txt
jmap -histo pid | less
jmap -dump :live,format=b,file=test.bin pid (生成一個test.bin的檔案)
jhat test.bin 或者 jhat -J-mx800m test.bin啟動一個java服務,用瀏覽器進行訪問分析
  • jmap -heap pid
  • jmap -histo pid > 3.txt最簡單快速定位記憶體溢位,前20個基本能找出來
  • jmap -dump :live,format=b,file=test.bin pid (生成一個test.bin的檔案)
  • 瀏覽器輸入IP:7000訪問,進行分析
  • jstat -gcutil 1893 1000 20(監控程序1893,1000毫秒列印一次,列印20次,監視java虛擬機器垃圾回收情況,各種gc的統計資料)
S0:存活區1使用佔比
S1:存活區2使用佔比
E:伊甸園區使用佔比
O:老年代使用佔比
P:持久帶使用佔比
YGC:YGC的次數
YGCT:YGC的時間
FGC:FGC的次數
FGCT:FGC的時間
GCT:總GC的時間

  

2. OutOfMemoryError: PermGen space 非堆溢位(永久儲存區域溢位)   PermGen space的全稱是Permanent Generation space,是指記憶體的永久儲存區域OutOfMemoryError: PermGen space從表面上看就是記憶體益出,解決方法也一定是加大記憶體。說說為什麼會記憶體益出:這一部分用於存放Class和Meta的資訊,Class在被 Load的時候被放入PermGen space區域,它和和存放Instance的Heap區域不同,GC(Garbage Collection)不會在主程式執行期對PermGen space進行清理,所以如果你的APP會LOAD很多CLASS的話,就很可能出現PermGen space錯誤。這種錯誤常見在web伺服器對JSP進行pre compile的時候。 解決方法
一般是在在Tomcat的bin目錄下的“catalina.sh”檔案中新增一行就可以解決問題 JAVA_OPTS='-Xms512m -Xmx2048m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m' -XX:MaxPermSize=128m(這個是按照記憶體1G配置,如果你的記憶體足夠大,你可以設定大於128) 3. OutOfMemoryError: unable to create new native thread. 無法建立新的執行緒 這種現象比較少見,也比較奇怪,主要是和jvm與系統記憶體的比例有關。這種怪事是因為JVM已經被系統分配了大量的記憶體(比如1.5G),並且它至少要佔用可用記憶體的一半。