6

私たちはいくつかの Oracle JVM ガベージ コレクション オプションを微調整しようとしています。ある開発者は-XX:PretenureSizeThreshold、多数のオブジェクトの配列が Tenured にすぐに配置されるようにするために使用しようとしました。配列のサイズがその中のすべてのオブジェクトの合計サイズと等しいかそれを超えるという仮定があったと確信しています。

しかし、Java では、オブジェクトの配列は単なる参照の配列ではありませんか? つまり、配列オブジェクト自体と同様に、配列内の各オブジェクトは、メモリ内で分離されており、ガベージ コレクターによって分離されたものとして扱われますか? 数百万のエントリがある場合でも、配列オブジェクトはかなり大きくなる可能性があると思いますが、各オブジェクトが参照よりもはるかに大きい場合、「含まれる」オブジェクトの合計サイズに近づくべきではありません。

私の知る限り、Cでは混乱があると思います:

  1. struct実際に s を格納するs の配列を持つことは可能structです。
  2. sへのポインターの配列を持つこともできstructます。

Javaは常にプリミティブ型の配列に1.を使用し、オブジェクトの配列には常に2.を使用しますが、Cは任意の型にいずれかを使用できます...?

ArrayList頻繁にappend()sを使用するとどうなりますか(目の前のケースのように)。配列のみがコピーされ、配列内のオブジェクトはコピーされませんか? また、配列がコピーされると、古い配列が Tenured にあったとしても、新しい配列は Eden で開始されますよね?

4

3 に答える 3

2

チューニングに使用-XX:PretenureSizeThresholdしても役に立たない可能性があります。このパラメーターは直接 Eden 割り当てにのみ適用されますが、ほとんどの割り当ては TLAB (スレッド ローカル割り当てバッファー) で行われ、-XX:PretenureSizeThreshold無視されます。

TLAB は、アクティブにメモリを割り当てるスレッドに対して非常に大きくなる可能性があります (数メガバイト)。

TLAB のサイジングを微調整してこの影響を減らすことができますが、それはおそらく害を及ぼすでしょう。

于 2013-10-17T05:52:44.917 に答える