1

現在、Jetty で Grails アプリケーションを実行しています。正常に動作していますが、必要以上にメモリを消費しています。

htopJetty が次のように実行されていることを示しています。java -server -Xmx256m -Xms256m -Xmn96m -XX:MaxPermSize=64m -Djetty.home=/home/...

したがって、Jetty が使用できる可能性のある最大メモリは 256 + 64 = 320 MB. 代わりに、次のようになります。

  PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ コマンド
 6256 桟橋 20 0 2747M 623M 13732 S 0.0 31.3 1:28.06 /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java -server -Xmx256m -Xms256m -Xmn96m -XX:MaxPermSize=64m -Djetty.ホーム=...

明らかに、メモリ使用量が正確に 320 MB になるとは思いませんが、近いはずではありませんか? 予想されるメモリの 2 倍になるのはなぜですか? どちらかといえば、ヒープがいっぱいになったときに Java がより多くのスペースを割り当てることを拒否すべきではないでしょうか?

で何が起こっているのかを正確に確認しようとしましたjmapが、すべてが正しいように見えます:

# jmap -ヒープ 6256
プロセス ID 6256 にアタッチしています。お待ちください...
デバッガーが正常に接続されました。
サーバー コンパイラが検出されました。
JVM のバージョンは 23.7-b01 です

スレッド ローカル オブジェクト割り当てを使用します。
4 スレッドの並列 GC

ヒープ構成:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize = 268435456 (256.0MB)
   NewSize = 100663296 (96.0MB)
   MaxNewSize = 100663296 (96.0MB)
   旧サイズ = 5439488 (5.1875MB)
   新しい比率 = 2
   生存率 = 8
   PermSize = 21757952 (20.75MB)
   MaxPermSize = 67108864 (64.0MB)
   G1HeapRegionSize = 0 (0.0MB)

ヒープ使用量:
PSヤングジェネレーション
エデン スペース:
   容量 = 65208320 (62.1875MB)
   使用済み = 33343488 (31.798828125MB)
   無料 = 31864832 (30.388671875MB)
   51.13379396984924% 使用済み
宇宙から:
   容量 = 17170432 (16.375MB)
   使用済み = 0 (0.0MB)
   無料 = 17170432 (16.375MB)
   0.0%使用
スペースへ:
   容量 = 18284544 (17.4375MB)
   使用済み = 0 (0.0MB)
   無料 = 18284544 (17.4375MB)
   0.0%使用
PSオールドジェネレーション
   容量 = 167772160 (160.0MB)
   使用済み = 132604224 (126.46124267578125MB)
   無料 = 35167936 (33.53875732421875MB)
   79.03827667236328% 使用済み
PSパーマジェネレーション
   容量 = 67108864 (64.0MB)
   使用済み = 55899320 (53.30974578857422MB)
   無料 = 11209544 (10.690254211425781MB)
   83.29647779464722% 使用済み

2932096 バイトを占める 26872 個のインターン文字列。

私が知る限り、perm gen スペースもヒープ スペースもいっぱいではありません。では、約 400 MB のメモリが何に使用されているのでしょうか? Grails アプリケーションまたは Jetty で変更して削減できるものはありますか?

過去にJettyでメモリ使用量の少ないGrailsアプリを実行しました。ちょうど今 1 つをチェックしたところ、220 MB のメモリが使用されているので、何が間違っているのかよくわかりません。

4

1 に答える 1

2

JVM は、ネイティブ メモリを含むネイティブリソースを消費するネイティブ プログラムです。ネイティブ メモリは、ランタイム プロセスで使用できるメモリであり、Java アプリケーションが使用する Java ヒープ メモリとは異なります。Java ヒープや Java スレッドを含むすべての仮想化されたリソースは、仮想マシンの実行時に使用されるデータと共に、ネイティブ メモリに格納する必要があります。また、この主題を非常にうまく説明しているこの回答
を 見ることもできます。 このスレッドは、Java でネイティブ メモリをリークする方法の良い例を示しています。Jetty のドキュメントでも、この件について言及されています。 JDK7 を使用している場合は、VisualVM バッファー モニター プラグインを使用できます。


ガベージ コレクション ヒープの外部に割り当てられたダイレクト バッファーを監視するため。

于 2013-03-08T10:00:02.850 に答える