問題のある 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?
そして、どうやってそれを見積もるのですか?