Tomcat
Java 中的 PermGen 錯誤,而記憶體使用率似乎很低
Java 應用程序不時因 PermGen 空間錯誤而當機,但是當我查看記憶體使用情況時,我可以說它似乎很低。
它是一個 Tomcat 應用程序,另外還有 SOLR 伺服器正在執行(在同一個 tomcat 下)。
JVM 參數在
catalina.sh
:-Xms1024m -Xmx2048m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/logs
錯誤
catalina.out
:java.lang.OutOfMemoryError: PermGen space Dumping heap to /path/to/logs/java_pid22335.hprof ... Heap dump file created [107041478 bytes in 1.823 secs] Exception in thread "pool-5-thread-1" java.lang.OutOfMemoryError: PermGen space
現在第一個奇怪的事情是記憶體轉儲只有100Mb,而堆限制是2048Mb。當我曾經有“適當的”記憶體不足錯誤時,轉儲文件的大小接近堆限制。
第二個奇怪的事情是顯示的記憶體使用情況
jmap -heap 22335
似乎很正常(執行此命令時,Java 應用程序仍處於關閉狀態):Attaching to process ID 22335, please wait... Debugger attached successfully. Server compiler detected. JVM version is 11.3-b02 using thread-local object allocation. Parallel GC with 16 thread(s) Heap Configuration: MinHeapFreeRatio = 40 MaxHeapFreeRatio = 70 MaxHeapSize = 2147483648 (2048.0MB) NewSize = 2686976 (2.5625MB) MaxNewSize = -65536 (-0.0625MB) OldSize = 5439488 (5.1875MB) NewRatio = 2 SurvivorRatio = 8 PermSize = 21757952 (20.75MB) MaxPermSize = 88080384 (84.0MB) Heap Usage: PS Young Generation Eden Space: capacity = 566689792 (540.4375MB) used = 13467648 (12.84375MB) free = 553222144 (527.59375MB) 2.3765467792297907% used From Space: capacity = 327680 (0.3125MB) used = 0 (0.0MB) free = 327680 (0.3125MB) 0.0% used To Space: capacity = 327680 (0.3125MB) used = 0 (0.0MB) free = 327680 (0.3125MB) 0.0% used PS Old Generation capacity = 1431699456 (1365.375MB) used = 86216248 (82.22222137451172MB) free = 1345483208 (1283.1527786254883MB) 6.021951579200712% used PS Perm Generation capacity = 88080384 (84.0MB) used = 88080080 (83.99971008300781MB) free = 304 (2.899169921875E-4MB) 99.99965486072358% used
我查看了記憶體轉儲文件,那裡沒有異常。嘗試增加堆限制,沒有區別。
任何想法可能是什麼以及為什麼轉儲文件如此之小,以及應用程序繼續拋出記憶體錯誤時的記憶體使用情況?
PS Perm Generation capacity = 88080384 (84.0MB) used = 88080080 (83.99971008300781MB) free = 304 (2.899169921875E-4MB) 99.99965486072358% used
有你的罪魁禍首。PermGen 用於類定義,你似乎有很多!
嘗試通過將其添加到您的 Tomcat 啟動選項來增加您的 PermGen 大小:
-XX:MaxPermSize=256M
…但是如果您的應用程序正在達到您目前的限制,則此更改只會在崩潰之間給您一些額外的時間。
監控它的行為方式以及使用量增長的速度,但準備好在您的應用程式碼中探勘問題類定義。