8

問題のある 64 ビット Java アプリをプロファイリングしているときに、プロファイラー自体 (YourKit) が本当に膨大な量のメモリを使用していることに気付きました。YourKit 起動スクリプトに含まれているのは次のとおりです。

JAVA_HEAP_LIMIT="-Xmx3072m -XX:PermSize=256m -XX:MaxPermSize=768m"

単純に、いくらかのオーバーヘッドを想定すると、これにより、YourKit がおそらく 4 GB を少し超える最大値を使用することになると推測できます。ただし、PSで実際に見られるのは次のとおりです。

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
dmoles   31379  4.4 68.2 14440032 8321396 ?    Sl   11:47  10:42 java -Xmx3072m -XX:PermSize=256m -XX:MaxPermSize=768m -XX:+HeapDumpOnOutOfMemoryError -Dyjp.probe.table.length.limit=20000 -Xbootclasspath/a:/home/dmoles/Applications/yjp-9.5.6/bin/../lib/tools.jar -jar /home/dmoles/Applications/yjp-9.5.6/bin/../lib/yjp.jar

これは、ほぼ 14 GB の仮想サイズとほぼ 8 GB の常駐サイズであり、Java ヒープのほぼ 3 倍です。

これで、開発ボックスにこれを実行するのに十分なメモリがありますが、診断しようとしている元のメモリの問題に戻ります。どのくらいの Java ヒープを使用する必要があるかを知るにはどうすればよいですか?

明らかに、顧客がたとえば 16 GB の物理 RAM を持っている場合、16 GB に設定するように言うのは得策ではありません-Xmx

では、妥当な数とは?12GB? 8GB?

そして、どうやってそれを見積もるのですか?

4

1 に答える 1

10

明らかに、顧客が 16 GB の物理 RAM を持っている場合、-Xmx を 16 GB に設定するように言うのは良い考えではありません。

顧客が自分のマシンで他に重要なことを何も実行していない場合、ヒープ サイズを 16G に設定することは必ずしも悪い考えではありません。アプリケーションが何をしているかによって異なります。

では、妥当な数とは?12GB? 8GB?

理想的な数値は、「JVM 最大ヒープ + JVM 非ヒープ オーバーヘッド + OS + 他のアクティブなアプリケーションのワーキング セット + バッファ キャッシュ ワーキング セット」の合計が物理メモリの量になることです。しかし、問題は、アプリケーションが実際の問題で実行されている間、顧客のマシンで詳細な測定を行わないと (最大ヒープサイズを除いて) これらのコンポーネントを特定できないことです。

そして、どうやってそれを見積もるのですか?

肝心なのは、できないということです。あなたができる最善のことは、推測することです...そして保守的です。

別の方法として、解決しようとしている問題に対してアプリケーションが実際に必要とするヒープの量を見積もることができます。次に、50% または 100% を追加して、GC が効率的に動作できるようにします。(そしてチューニング...)

于 2012-04-19T00:07:39.623 に答える