0

オブジェクトがJavaのヒープメモリにどのように格納され、削除されるかを誰かが私に説明できますか?私は単に:より多くの情報を探しています:

参照がないObject場合は削除されます

例えば:

class Heap
{
    void add(int a, int b)
    {
        System.out.println(a+b);
    }

    public static void main(String ar[])
    {
        Heap obj=new Heap();
        obj.add(4,3);
        obj.add(5,5);
    }
}

ここでは、Javaメモリに割り当てられた`bJはどのようにobjなっaていますか。JVMによっていつメモリから削除されますか?

4

4 に答える 4

4

簡単に言えば:

  1. objnew Heap()が呼び出されると、ヒープに割り当てられます。
  2. ab両方がスタックに割り当てられ(プリミティブ型、メソッド引数)、メモリはから戻ると解放されますadd
  3. obj実行が終了した後にガベージコレクターが実行されるたびにヒープから削除されますmain(仕様は、GCがいつでも実行されることを保証するものではなく、ほぼフルヒープですが、それ自体で適切なタイミングを判断します。おそらく非常に一般的なトリガーです)-この場合、プログラムは終了するため、から戻った直後になりますmain
于 2012-06-28T11:28:16.443 に答える
3

Heapオブジェクトはヒープ内に作成されます。これには、クラス変数とメンバー変数内のメソッドが含まれます。メソッドを呼び出すと、スタック内にロードされ、そのメソッドの実行後にjvmによって自動的に破棄されます。

メモリのスタックセクションには、メソッド、ローカル変数、および参照変数が含まれています。

ヒープセクションにはオブジェクトが含まれます(参照変数も含まれる場合があります)。

于 2012-06-28T11:25:23.400 に答える
3

ええと...aとbはヒープにまったく割り当てられていません。

それらは関数に渡すためにスタック上にあります。実行が終了するとすぐにadd()、変数abは使用できなくなり、jvmによって削除されます。

于 2012-06-28T11:25:43.510 に答える
2

プログラムを実行するとき:

  1. メソッドが実行される前にmain、JVMは新しい実行スレッドを割り当てます。このスレッド(メインスレッドと呼ばれます)にはスタックが関連付けられ、スタックはローカル変数と一時データが配置される場所です。
  2. スタック内で、新しいフレームがmainメソッドに関連付けられます。
  3. The obj reference will be created in the main method stack frame.
  4. When you invoke the new Heap() the JVM will attempt to allocate memory for your object in the heap memory area. If successful, it will assign an object reference to your local variable, if it fails, it may attempt to make room for your object running the garbage collector, if still fails to find enough room for it an OutOfMemoryError is thrown.
  5. When you invoke the add(int, int) method on your memory reference, the JVM will first dereference the pointer to gain access to the actual object in the heap, if it fails a NullPointerException will be thrown, otherwise it will look for the method to be executed in what is called the method area (an area of memory where class information is located).
  6. If the method is found, a new frame is created in the in the stack of the currently executing thread, and the control of execution is transferred to the new method.
  7. Two variables are placed in the method stack frame a and b and they are initialized with copies of the values you passed as arguments (i.e. 4, 3).
  8. The method does what it does, and when it is done the current stack frame is destroyed, and control of execution returns to the previous frame.
  9. Since you invoke the method add again, the process is repeated.
  10. The main method ends, its stack frame is removed. Now the obj reference is lost and there is no longer a way to reach to your object in the heap. The object it was pointing to is now illegible for garbage collection.
  11. The JVM process is terminated and all related resources are freed. Probably in this scenario, the garbage collection actually never run, but if it did, the memory occupied by your object in the heap would be reclaimed.
于 2012-06-28T11:49:32.930 に答える