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);
    }
}

这里是如何obja, `bJ 在 java 内存中分配的。JVM什么时候会从内存中删除?

4

4 回答 4

4

简单地说:

  1. objnew Heap()调用时在堆上分配。
  2. a并且b两者都在堆栈上分配(原始类型,方法参数),内存将在从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. obj引用将在主方法堆栈帧中创建。
  4. 当您调用new Heap()JVM 时,JVM 将尝试在堆内存区域中为您的对象分配内存。如果成功,它将为您的局部变量分配一个对象引用,如果失败,它可能会尝试为运行垃圾收集器的对象腾出空间,如果仍然无法为它找到足够的空间OutOfMemoryError并抛出。
  5. 当您add(int, int)在内存引用上调用该方法时,JVM 将首先取消引用该指针以获得对堆中实际对象的访问权,如果失败NullPointerException将抛出一个,否则它将在调用的对象中查找要执行的方法方法区(类信息所在的内存区域)。
  6. 如果找到该方法,则在当前正在执行的线程的堆栈中创建一个新的帧,并将执行的控制权转移给新的方法。
  7. 两个变量放置在方法堆栈框架 a 和 b 中,它们使用您作为参数传递的值的副本进行初始化(即 4、3)。
  8. 该方法执行它所做的,当它完成时,当前堆栈帧被销毁,执行控制返回到前一帧。
  9. 由于您再次调用方法 add,因此重复该过程。
  10. main方法结束,其堆栈帧被删除。现在obj引用丢失了,不再有办法访问堆中的对象。它指向的对象现在无法进行垃圾收集。
  11. JVM 进程终止并释放所有相关资源。可能在这种情况下,垃圾收集实际上永远不会运行,但如果它运行了,那么堆中的对象所占用的内存将被回收。
于 2012-06-28T11:49:32.930 回答