私たちはいくつかの Oracle JVM ガベージ コレクション オプションを微調整しようとしています。ある開発者は-XX:PretenureSizeThreshold
、多数のオブジェクトの配列が Tenured にすぐに配置されるようにするために使用しようとしました。配列のサイズがその中のすべてのオブジェクトの合計サイズと等しいかそれを超えるという仮定があったと確信しています。
しかし、Java では、オブジェクトの配列は単なる参照の配列ではありませんか? つまり、配列オブジェクト自体と同様に、配列内の各オブジェクトは、メモリ内で分離されており、ガベージ コレクターによって分離されたものとして扱われますか? 数百万のエントリがある場合でも、配列オブジェクトはかなり大きくなる可能性があると思いますが、各オブジェクトが参照よりもはるかに大きい場合、「含まれる」オブジェクトの合計サイズに近づくべきではありません。
私の知る限り、Cでは混乱があると思います:
struct
実際に s を格納するs の配列を持つことは可能struct
です。- sへのポインターの配列を持つこともでき
struct
ます。
Javaは常にプリミティブ型の配列に1.を使用し、オブジェクトの配列には常に2.を使用しますが、Cは任意の型にいずれかを使用できます...?
ArrayList
頻繁にappend()
sを使用するとどうなりますか(目の前のケースのように)。配列のみがコピーされ、配列内のオブジェクトはコピーされませんか? また、配列がコピーされると、古い配列が Tenured にあったとしても、新しい配列は Eden で開始されますよね?