Tomcat

Java 中的 PermGen 錯誤,而記憶體使用率似乎很低

  • December 5, 2013

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

…但是如果您的應用程序正在達到您目前的限制,則此更改只會在崩潰之間給您一些額外的時間。

監控它的行為方式以及使用量增長的速度,但準備好在您的應用程式碼中探勘問題類定義。

引用自:https://serverfault.com/questions/416470