web-dev-qa-db-ja.com

JavaでのPermGenエラー、メモリ使用量が少ないようです

Javaアプリケーションは、PermGenスペースエラーでときどき停止しますが、メモリ使用量を見ると、私が知る限りでは低いようです。

これはTomcatアプリケーションであり、さらに(同じTomcatの下で)SOLRサーバーが実行されています。

catalina.shのJVMパラメータ:

-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

さて、最初の奇妙なことは、ヒープ制限が2048Mbであるのに対し、メモリダンプはわずか100Mbであるということです。以前は「適切な」メモリ不足エラーが発生していましたが、ダンプファイルのサイズはヒープ制限に近かったです。

2番目の奇妙なことは、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

私はメモリダンプファイルを見ましたが、そこには何も異常はありませんでした。ヒープ制限を増やしてみましたが、違いはありません。

それが何である可能性があり、ダンプファイルが非常に小さいのはなぜですか?アプリがメモリ不足エラーをスローし続けている間のメモリ使用量もそうですか?

5
serg
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

...ただし、アプリケーションが現在の制限に達している場合、この変更により、クラッシュの間隔が少し長くなります。

それがどのように動作し、使用量がどれだけ急速に増加するかを監視しますが、問題のあるクラス定義についてアプリケーションコードを掘り下げる準備をしてください。

6
Shane Madden

PermGenの最大サイズは別のコマンドラインスイッチで設定します。-XX:MaxPermSize=128Mを試してください。PermGenには十分なはずです。

3
Alex