2012-04-18 43 views
6

問題がある64ビットJavaアプリケーションをプロファイリングする過程で、Profiler自体(YourKit)が本当に莫大な量のメモリを使用していることがわかりました。私はYourKitの起動スクリプトに持っていることは次のとおりです。64ビットJavaで最大安全なJVMヒープサイズを推定する

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

単純に、いくつかのオーバーヘッドを想定し、これはYourKitが4ギガバイトを超える多分ビット何かの最大を使用しようとしていることを推測するために私につながります。しかし、私が実際にPSで見るものは次のとおりです。ほぼ14ギガバイトの仮想サイズとほぼ8ギガバイトの常駐サイズ

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 

だこと - ほとんどのJavaヒープ3倍。

これを実行するには十分なメモリがありますが、私が診断しようとしている元のメモリの問題に戻ります。

明らかに、お客様が16GBの物理RAMを持っている場合は、-Xmxを16GBに設定するように教えてもらえません。

なのでですか? 12 GB? 8 GB?

それはどのように見積もりますか?顧客は、たとえば、16ギガバイトの物理RAMを持っているなら、私は16ギガバイトに-Xmxを設定するためにそれらを伝えるためにため

答えて

9

明らかに、それは素晴らしいアイデアではありません。

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

だから、妥当な数字は何ですか? 12 GB? 8 GB?

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

また、どのように見積もりますか?

結論はできません。あなたがすることができる最良のことは、推測して、保守的であることです。

代替アプローチは、アプリケーションが解決しようとしている問題に対して実際に必要なヒープの量を推定することです。その後、余分な50%または100%を追加して、GCルームを効率的に機能させます。 (そして調整する...)

+0

+1アプリケーションが必要とするヒープ量を推定しそこから行くことをお勧めします。 「私はそれをどのように見積もるのか」という質問は、スレッドの幸福の悲劇に関するエリック・リッパートの記事を思い起こさせる(http://blogs.msdn.com/b/ericlippert/archive/2004/02/15/the-tragedy- of-thread-happiness-disease.aspx)。 –

+0

@AdamMihalcin Ouch。 :) –

+0

@AdamMihalcinそれは良いアドバイスですが、コインには2つの側面があります。ヘッド(アプリケーションがどれだけ必要とするかを見積もる)は、「ここにユーザー数はどれくらいあり、購入するサーバーはいくらですか? Tailsは、「ここにサーバーがどれくらいあるのか、メモリが足りなくなる前に処理できるユーザーの数はいくらですか? –

関連する問題