Java のメソッド内で int (または任意のプリミティブ型) を宣言した場合、そのメモリは関数が返された瞬間に解放されますか? それとも、ガベージ コレクターがクリーンアップするまでハングアップする必要がありますか?
Cではスタックポインターがリセットされ、すぐにメモリが解放されることを知っています.Javaのオブジェクトはガベージコレクションが必要であることは知っていますが、プリミティブでどのアプローチが取られるかはわかりません。
Java のメソッド内で int (または任意のプリミティブ型) を宣言した場合、そのメモリは関数が返された瞬間に解放されますか? それとも、ガベージ コレクターがクリーンアップするまでハングアップする必要がありますか?
Cではスタックポインターがリセットされ、すぐにメモリが解放されることを知っています.Javaのオブジェクトはガベージコレクションが必要であることは知っていますが、プリミティブでどのアプローチが取られるかはわかりません。
メソッドが返されると、そのスタック上の変数は常にすぐに解放されます (もちろん、解放されるとは、スタック フレームが破棄されることを意味し、ローカル変数のようにスタック フレームに接続されているすべてのメモリも破棄されます)。
ただし、その変数がオブジェクトの場合、その値はポインターです。オブジェクトを含む実際のメモリ (他のオブジェクトへのポインタもある場合があります) は、ヒープ上にあります。スタック上の参照が解放されると、オブジェクトは誰も参照せずにただ座っているだけです (別の場所に参照を置かない限り)。そのとき、Java が入り、ガベージ コレクションが行われる可能性があります。つまり、オブジェクトにコレクションのフラグが付けられ、コレクターが次に実行されるときに、このオブジェクトがクリーンアップされます。
プリミティブは生の値を持ち、ポインターではありません。したがって、他の回答で述べたように、それらを GC する必要はありません。
これは、C のmalloc
andに非常によく似ています。free
C の変数に一部のメモリを malloc し、関数が戻ると、そのポインタのメモリは解放されますが、それが指していたメモリは解放されません。
Java で (おそらくnew
キーワードを使用して) オブジェクトを作成すると、そのオブジェクトにメモリが割り当てられます。free
ただし、 Java で明示的に呼び出すことはありません。JVM は、解放を行う必要がある時期を検出します。
参照を null に設定して、もう必要ないことを JVM に伝えることができますが、最小限のスコープを使用する方がよい場合がよくあります。