对象是从堆内存中存储和删除

时间:2012-06-28 11:20:47

标签: java memory memory-management

任何人都可以向我解释如何在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内存中分配obja,`bJ。什么时候它会被JVM从内存中删除?

4 个答案:

答案 0 :(得分:4)

简单地说:

  1. obj在调用new Heap()时在堆上分配。
  2. ab都在堆栈上分配(基本类型,方法参数),内存将在从add返回时释放。
  3. 执行完成obj后,每当垃圾收集器运行时,
  4. main将从堆中删除(规范不保证GC在任何给定时间都会运行,它会在何时确定正确的时间本身,虽然几乎全堆可能是一个非常常见的触发器 - 在这种情况下,因为程序将终止,它将立即从main返回。

答案 1 :(得分:3)

Heap对象将在堆内创建。它将包含类和成员变量中的方法。 当你调用一个方法时,它将被加载到堆栈中,并在执行该方法后由jvm自动丢弃。

内存的堆栈部分包含方法,局部变量和引用变量。

部分包含对象(也可能包含引用变量)。

答案 2 :(得分:3)

嗯......根本没有在堆上分配a和b。

它们在堆栈中传入函数。一旦执行离开add(),变量ab就不能再使用,并且将被jvm删除。

答案 3 :(得分:2)

当你run your program时:

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