2

なぜコード

while(true)
  new Object();

OutOfMemoryException は発生しませんか?

4

4 に答える 4

10

各ループ反復が完了すると、オブジェクトは GC の対象となるためです (このため、HEAP は満たされません)。JVM がより多くのメモリを必要とする場合、適格なオブジェクトをクリーンアップできます。

The Truth About Garbage Collectionを読むことをお勧めします(IP があるため、ここにリンクを投稿できませんでした。Google で検索してください)。

于 2012-11-09T19:45:21.820 に答える
5

新しいオブジェクトを永続変数に割り当てていないため、メモリ不足になる前に Java 仮想マシンが各オブジェクトをガベージ コレクションするため、メモリ不足になることはありません。

一方、あなたが言った場合

List<Object> xs = new LinkedList<Object>();
while (true) {
    xs.add(new Object());
}

そうすると、ガベージが自動的に収集されず、最終的にメモリが不足します。

于 2012-11-09T19:46:11.280 に答える
2

OutOfMemoryErrorJVMは、作成するガベージの量に関係なく、再利用可能なヒープが残っている場合は、を受け取らないことを保証します。これに対する唯一の例外は、GCパフォーマンスのオーバーヘッドが定義されたしきい値を超えた場合です。ただし、あなたの場合、GC-ingは実際には非常に簡単で、非常に高速です。マイナーな収集サイクルごとに、すべてのオブジェクトがスレッドローカル領域の1つの巨大なブロックとして収集されます。

于 2012-11-09T19:48:39.557 に答える
2

作成した新しいオブジェクトへの参照を保存していないため、ガベージコレクターはメモリが不足するたびにそれらを簡単に削除できます。

于 2012-11-09T19:45:56.273 に答える