なぜコード
while(true)
new Object();
OutOfMemoryException は発生しませんか?
各ループ反復が完了すると、オブジェクトは GC の対象となるためです (このため、HEAP は満たされません)。JVM がより多くのメモリを必要とする場合、適格なオブジェクトをクリーンアップできます。
The Truth About Garbage Collectionを読むことをお勧めします(IP があるため、ここにリンクを投稿できませんでした。Google で検索してください)。
新しいオブジェクトを永続変数に割り当てていないため、メモリ不足になる前に Java 仮想マシンが各オブジェクトをガベージ コレクションするため、メモリ不足になることはありません。
一方、あなたが言った場合
List<Object> xs = new LinkedList<Object>();
while (true) {
xs.add(new Object());
}
そうすると、ガベージが自動的に収集されず、最終的にメモリが不足します。
OutOfMemoryError
JVMは、作成するガベージの量に関係なく、再利用可能なヒープが残っている場合は、を受け取らないことを保証します。これに対する唯一の例外は、GCパフォーマンスのオーバーヘッドが定義されたしきい値を超えた場合です。ただし、あなたの場合、GC-ingは実際には非常に簡単で、非常に高速です。マイナーな収集サイクルごとに、すべてのオブジェクトがスレッドローカル領域の1つの巨大なブロックとして収集されます。
作成した新しいオブジェクトへの参照を保存していないため、ガベージコレクターはメモリが不足するたびにそれらを簡単に削除できます。