1. 程式人生 > >記一次JVM調優(Permanent Generation)

記一次JVM調優(Permanent Generation)

最近在一次搭建公司系統執行環境的時候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類、方法等。