Java 中 PermGen 出现错误,但内存使用率似乎较低

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

我查看了内存转储文件,没有什么异常。尝试增加堆限制,没有变化。

有什么想法可能是什么以及为什么转储文件这么小,那么当应用程序继续抛出内存不足错误时内存使用情况如何?

答案1

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

...但是如果您的应用程序超出了当前的限制,则此更改只会为您提供两次崩溃之间的一些额外时间。

监视它的行为方式和使用量增长的速度,但要准备在应用程序代码中深入挖掘问题类定义。

答案2

最大 PermGen 大小由单独的命令行开关设置,尝试一下-XX:MaxPermSize=128M,这对于 PermGen 来说应该足够了。

相关内容