2009-07-23 7 views

答えて

1

、私はあなたに二つの例与えてみましょう:

例1を - あなたのプログラムが起動時にメモリの100Mの価値を割り当て、その後、残りのように、これまでどのような任意のメモリを割り当てませんその実行の。

この場合、スペースを無駄にしないように、ヒープサイズを100Mに設定する必要があります(ただし、おそらく101か何かが発生しますが...)。

例2 - プログラムは1秒あたり10Mのメモリを割り当てます。データは1秒以上持続されません。 (たとえば、多くの一時的なデータを必要とする計算をしていて、完了したら1つの整数を返します...)

正確な数値を知ることはあまり現実的ではないかもしれませんが、私と一緒に... "ライブ"データが10Mあるので、少なくとも10Mのヒープが必要です。それ以外に、ガベージコレクタがどのように動作するかを確認する必要があります。単純化すると、GCが完了するまでの時間はO(ライブセット)です。つまり、「死んだ」データの量は実際には入りません。一定のライブセットサイズでは、GC時間はヒープサイズに関係なく一定です。これによりヒープが大きくなります - >スループットが向上します。

(今、本当に台無しあなたは、ヒープの圧縮のようなものを追加して、画像がさらに少なく明確になる...)

それは問題の簡易版です 結論が、短いです答えは - それに依存します。

2

理想的な瞬時比は1です。理想的には、JVMは必要なメモリを正確に消費します。 )難しい目標です。)

問題点(TNilssonが指摘しているように)は、アプリケーションのメモリ要件が時間の経過とともに変化するため、一定の収集/圧縮を起こさない十分な領域を確保したいという問題がありますあなたが許容できるよりも頻繁に、あなたはそれがあなたがより多くのRAMを購入する必要がない十分なスペースをほとんど消費しないようにします。

+0

heapsize = live set-sizeまたはそれに近い値を設定すると、ガーベジコレクションと圧縮が常に行われます。 1を達成しようとすると、ひどいパフォーマンスにつながります。 – Tnilsson

+0

これは本当に良い点です。私はそれを説明するために編集します。 –

1

これはおそらく、新しいオブジェクトを割り当てる割合によって異なります。ガベージコレクションには、ライブオブジェクトからの多くの作業トレース参照が含まれます。私はちょうど500MBの空き容量があり500MBの空き容量があったが、JVMがGCを実行する時間の95%を費やすほど多くの配列の割り当てが行われている状況を扱っている。したがって、ランタイムメモリの動作を忘れないでください。

「オブジェクト割り当てはJavaで本当に高速です」と言っているこれらのパフォーマンスチューニングの記事は、GC時間が1秒になると言わずに笑います。単一の簡単な答えはありません

+0

空きメモリが非常に多いときにガベージコレクションが行われたのはなぜですか? – user39732

+0

新しいゴミは絶えず割り当てられているので、数秒後にあなたが使い果たします。それが分の場合は大丈夫です。あなたが数秒で使い果たしたなら、それは悪いことです。ミリ秒であれば恐ろしいことです。 –

+0

Heh。オブジェクトの割り当ては本当に速いです。オブジェクトの割り当ての余地があることを確認することは、時間がかかることです。 – Tnilsson

関連する問題