2017-08-10 23 views
3

これに私の言葉を使わないでください。私はちょうど私がさまざまな情報源からつなぎ合わせたものを繰り返しています。 HotSpot JVMは、スレッドローカル割り当てバッファ(TLAB)を使用します。 TLABは同期されてもされなくてもよい。ほとんどの場合、TLABは同期されておらず、したがってスレッドは非常に迅速に割り当てることができます。アクティブなスレッドが独自のTLABを取得できるように、多数のTLABが存在します。アクティブでないスレッドは、同期されたTLABを共有します。スレッドがTLABを使い果たすと、プールから別のTLABを取得します。プールにTLABがなくなると、Young GCが起動または必要になります。Javaヒープ内の未使用領域を最適化する方法

プールにTLABがなくなると、TLABにはまだスペースが残っています。この「未使用スペース」は増えており、重要です。予約されたヒープ・サイズまたは最大ヒープ・サイズに達する前にGCがトリガーされるため、このスペースを見ることができます。したがって、ヒープは効果的に10〜30%小さくなります。少なくともヒープ使用グラフを見ると私の推測です。

未使用領域を減らすためにJVMをチューニングするにはどうすればよいですか?

答えて

2

あなたはそれらを変更するときに、これらのほとんどの「深いダウンと汚い」の設定と同じように-XX:TLABSize

ただし、コマンドラインオプションで設定すると、あなたは非常に注意しなければならないことをひねると密接に変更の影響を監視することができます。

2

TLABがないと、若い世代のコレクションがあり、それらはクリーニングされるということは間違いありません。

私はあまり言うことはできませんが、JVMは、私が推測配分の統計に基づいてサイズを変更するためTLABWasteTargetPercentと呼ばれるフラグが(デフォルトでは1%ある)もありますなど、エデンサイズ、可能にResizeTLABがあります。現行のTLABがもう1つのオブジェクトに適合できない場合、JVMは何をすべきかを決定する必要があります。つまり、ヒープに直接割り当てるか、新しいTLABを割り当てます。

このオブジェクトのサイズが1% of the current TLAB sizeより大きい場合は、直接割り当てられます。それ以外の場合は、現在のTLABは廃止されます。

それでは、TLABの現在のサイズを言わせて(TLABSize、デフォルトではそれが適応されますつまり、ゼロである)(すべての数字は理論上あり)100 bytesあり、その1%は1 byteある - それはTLABWasteTargetPercentです。現在、TLABは98バイトで満たされており、割り当てたいオブジェクトは3バイトです。このTLABに収まらないと同時に、1バイトのしきい値より大きい=>ヒープに直接割り当てられます。

もう1つの方法は、TLABが99.7バイトでいっぱいで、1/2バイトオブジェクトを割り当てようとすることです。これは適合しません。 1バイトより小さい。したがって、このTLABはコミットされ、新しいTLABが与えられます。

私が理解する限り、TLABWasteIncrementというもう1つのパラメータがあります - TLABに割り当てられずに(ヒープに直接割り当てられる) - このストーリーは永遠に起こらないように、TLABWasteTargetPercentはこれによって増加します値(デフォルト値の4%)を使用すると、このTLABを廃止する機会が増えます。

TLABAllocationWeightTLABRefillWasteFractionがあります。この投稿は少し後で更新されます

関連する問題