記一次JVM調優(Permanent Generation)
阿新 • • 發佈:2019-02-10
最近在一次搭建公司系統執行環境的時候tomcat總是報出
java.lang.OutOfMemoryError PermGen space
的問題,即記憶體溢位
在解決這個問題的時候
一.問題解決
此處用到一個命令:jmap
顯示java堆中的詳細資訊(程序號7180)
C:\Users\zhangyu>jmap -heap 7180
Attaching to process ID 7180, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 20.45 -b01
using thread-local object allocation.
Parallel GC with 4 thread(s)
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 1004535808 (958.0MB) //最大堆大小,預設為實體記憶體的1\4
NewSize = 1310720 (1.25MB)
MaxNewSize = 17592186044415 MB //64位作業系統理論無限制
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 21757952 (20.75MB) //非堆區大小
MaxPermSize = 85983232 (82.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 163119104 (155.5625MB)
used = 1433824 (1.367401123046875MB)
free = 161685280 (154.19509887695312 MB)
0.8790043378364805% used
From Space:
capacity = 65536 (0.0625MB)
used = 0 (0.0MB)
free = 65536 (0.0625MB)
0.0% used
To Space:
capacity = 8060928 (7.6875MB)
used = 0 (0.0MB)
free = 8060928 (7.6875MB)
0.0% used
PS Old Generation
capacity = 669712384 (638.6875MB)
used = 89397320 (85.25592803955078MB)
free = 580315064 (553.4315719604492MB)
13.348613843162859% used
PS Perm Generation
capacity = 85983232 (82.0MB)
used = 85983168 (81.99993896484375MB)
free = 64 (6.103515625E-5MB)
99.99992556688262% used
可以發現 Perm Generation 明顯不夠用,因此需要增大該空間
-XX:PermSize=128M
-XX:MaxPermSize=256M
而在上一篇文章中,對JVM的記憶體說明並不是很詳細
補充以下:
二.JVM記憶體
1.整體記憶體可以分為堆區和非堆區
堆區:
所有new的物件都在堆區
新生代、中生代、老年代源自於對堆區的細分
Java中每新new一個物件所佔用的記憶體空間就是新生代的空間,當java垃圾回收機制對堆區進行資源回收後,那些新生代中沒有被回收的資源將被轉移到中生代,中生代的被轉移到老生代。
-XX:MaxNewSize=518 等是對新生代的最大值進行設定
非堆區:
包括持久帶, 用來存放靜態檔案,如Java類、方法等。