14

Java のメソッド内で int (または任意のプリミティブ型) を宣言した場合、そのメモリは関数が返された瞬間に解放されますか? それとも、ガベージ コレクターがクリーンアップするまでハングアップする必要がありますか?

Cではスタックポインターがリセットされ、すぐにメモリが解放されることを知っています.Javaのオブジェクトはガベージコレクションが必要であることは知っていますが、プリミティブでどのアプローチが取られるかはわかりません。

4

3 に答える 3

19

メソッドが返されると、そのスタック上の変数は常にすぐに解放されます (もちろん、解放されるとは、スタック フレームが破棄されることを意味し、ローカル変数のようにスタック フレームに接続されているすべてのメモリも破棄されます)。

ただし、その変数がオブジェクトの場合、その値はポインターです。オブジェクトを含む実際のメモリ (他のオブジェクトへのポインタもある場合があります) は、ヒープ上にあります。スタック上の参照が解放されると、オブジェクトは誰も参照せずにただ座っているだけです (別の場所に参照を置かない限り)。そのとき、Java が入り、ガベージ コレクションが行われる可能性があります。つまり、オブジェクトにコレクションのフラグが付けられ、コレクターが次に実行されるときに、このオブジェクトがクリーンアップされます。

プリミティブは生の値を持ち、ポインターではありません。したがって、他の回答で述べたように、それらを GC する必要はありません。

これは、C のmallocandに非常によく似ています。free

C の変数に一部のメモリを malloc し、関数が戻ると、そのポインタのメモリは解放されますが、それが指していたメモリは解放されません。

Java で (おそらくnewキーワードを使用して) オブジェクトを作成すると、そのオブジェクトにメモリが割り当てられます。freeただし、 Java で明示的に呼び出すことはありません。JVM は、解放を行う必要がある時期を検出します。

参照を null に設定して、もう必要ないことを JVM に伝えることができますが、最小限のスコープを使用する方がよい場合がよくあります。

于 2013-09-11T16:47:47.633 に答える