次のコードを実行するとどうなりますか。
while (true) {
String x = new String("ABC");
}
メモリの観点から?
文字列xはスタックまたはヒープに割り当てられていますか?メモリオーバーフローが原因でプログラムが最終的にクラッシュしますか、それともガベージコレクションがそれを防ぎますか?新しいキーワードは常にヒープ上にオブジェクトを作成しますか?スタック上にオブジェクトが作成されるのはいつですか?
ありがとう!
次のコードを実行するとどうなりますか。
while (true) {
String x = new String("ABC");
}
メモリの観点から?
文字列xはスタックまたはヒープに割り当てられていますか?メモリオーバーフローが原因でプログラムが最終的にクラッシュしますか、それともガベージコレクションがそれを防ぎますか?新しいキーワードは常にヒープ上にオブジェクトを作成しますか?スタック上にオブジェクトが作成されるのはいつですか?
ありがとう!
文字列xはスタックまたはヒープに割り当てられていますか?
x
ではありませんString
。への参照String
です。参照はローカル変数であるため、スタックに配置されます。はString
オブジェクトであるため、ヒープ上に移動します。
メモリオーバーフローが原因でプログラムが最終的にクラッシュしますか
おそらくそうではありません。
またはガベージコレクションはそれを防ぎますか?
そうすべき。
新しいキーワードは常にヒープ上にオブジェクトを作成しますか?
はい。
スタック上にオブジェクトが作成されるのはいつですか?
決して...JVMが現在のスコープをエスケープできないと判断し、そうすることを決定しない限り。
newを使用すると、はい、オブジェクトがヒープに配置されます。どのスレッドからもアクセスできなくなったオブジェクトは、ガベージコレクションできます。メモリが不足するかどうかは、プログラムが使用するデータのサイズによって異なります。オブジェクトの「解放」が得意な場合は、もう必要ありません(メモリリークが悪いと考えてください)。
あなたの例では、ガベージコレクターを狂ったように実行します。これは、あなたが実証しようとしていることだと思います。
ローカル変数はスタックに入れられます。
理論的にnew
は、ヒープ上に作成され、非オブジェクト(つまり、int
s、char
sなど)はスタック上に作成されます。唯一の例外であるafaikは、スタック上に作成された文字列です。実際には、多くの最新のJVMのJITコンパイラーは、場合によっては、でnew
作成されたオブジェクトをスタック上に作成できることを認識します(たとえば、現在の関数の外部で参照されていないローカルオブジェクト)。
ガベージコレクターが割り当て解除を処理します。これが目的ですが、同時に多数のオブジェクトの参照を作成して保持すると、メモリが不足する可能性があります(10億の文字列を含むリストを作成してみてください。例)。