1

私は Java プログラムを書いていますが、Java でのメモリ管理について明確にしたいと思っています。たとえば、次のような方法です。

 public void example1() {
        byte[] bytes = new byte[100];
    }

このメソッドを呼び出した後、Heap 空間で「new」によって作成された byte[] 空間は消滅しますか? このような2番目の例:

public byte[] example2() {
       byte[] bytes = new byte[100];
       return bytes
}

また、この状況で byte[] スペースがなくなるのでしょうか?

4

5 に答える 5

4

ガベージ コレクターが実行されると、スペースはガベージ コレクションされ、参照がなくなったことを検出します。この場合、これが関連する唯一のコードである場合、参照はメソッドが終了すると存在しなくなるため、スペースはそれ以降のコレクションの対象となります。

于 2013-04-20T05:25:30.920 に答える
0

一般に、オブジェクトの空間がいつ「消滅」するかを確実に言うことはできません。つまり、それを表すために使用されたメモリが再利用されるときです。確実に言えることは、次のことだけです。

  • 何かがオブジェクトを使用できる可能性がある間は、スペースは再利用されません。つまり、まだ到達可能です。

  • オブジェクトがunreachableの場合、JVM がメモリ不足をアプリケーションに通知する必要があるポイントに到達する前に、そのオブジェクトは再利用されます。

幸いなことに、再利用がいつ発生するかを心配する必要はありません。起こりうることなら、トラブルになる前に起きます。

悪いニュース (一種) は、オブジェクトがいつ再利用されるかを予測できないため、タイミングに依存するコードを書くのは良くないということです。finalizeたとえば、タイムリーに実行されるメソッドに依存します。


最初の例ではbyte[]、メソッドが返されたときにガベージ コレクションの対象となります。2 番目の例では、何も言えません。呼び出し元が戻り値をどうするかによって異なります。

于 2013-04-20T06:48:31.290 に答える
0

Java プログラマーは、Java でガベージ コレクションを強制することはできません。Java ヒープ サイズに基づいてガベージ コレクションが必要であると JVM が判断した場合にのみトリガーされます。ガベージ コレクターが実行され、それに対する参照がなくなったことを検出します。

ここを見る

于 2013-04-20T05:26:02.093 に答える
0
public void example1() {
    byte[] bytes = new byte[100];
}

変数によって参照されるオブジェクトbytesは、メソッドの完了後にガベージ コレクションの対象になります。example1()これは、ローカル変数の形式で唯一のアクティブな参照がbytes関数呼び出しスタックから削除されるためです。

public byte[] example2() {
   byte[] bytes = new byte[100];
   return bytes
}

ここで参照されるオブジェクトは、参照を返すためbytes、メソッドの終了直後はガベージ コレクションの対象になりません。example2()だから、あなたがこのようなものを持っていればbyte[] returnedRef = example2()。次に、returnRef ローカル メソッド変数bytesが関数呼び出しスタックから削除された後でも、参照が変数によって保持されるようになりました。そのため、1)または 2)ifをローカル変数にすることによって保持されているその参照returnedRefが切り離されるまで、定義されているメソッドの最後で、それはパージされ、オブジェクトはガベージ コレクションの対象になりません。returnedRef=nullreturnedRefreturnedRef

オブジェクトがガベージ コレクションの対象であっても、必ずしも GC によって破棄されるとは限りません。ガベージ コレクタがいつ実行されるかは、JVM に決定を委ねるのが最善です。

于 2013-04-20T05:31:34.053 に答える