任何人都可以向我解释如何在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内存中分配obj
和a
,`bJ。什么时候它会被JVM从内存中删除?
答案 0 :(得分:4)
简单地说:
obj
在调用new Heap()
时在堆上分配。a
和b
都在堆栈上分配(基本类型,方法参数),内存将在从add
返回时释放。obj
后,每当垃圾收集器运行时,main
将从堆中删除(规范不保证GC在任何给定时间都会运行,它会在何时确定正确的时间本身,虽然几乎全堆可能是一个非常常见的触发器 - 在这种情况下,因为程序将终止,它将立即从main
返回。答案 1 :(得分:3)
Heap对象将在堆内创建。它将包含类和成员变量中的方法。 当你调用一个方法时,它将被加载到堆栈中,并在执行该方法后由jvm自动丢弃。
内存的堆栈部分包含方法,局部变量和引用变量。
堆部分包含对象(也可能包含引用变量)。
答案 2 :(得分:3)
嗯......根本没有在堆上分配a和b。
它们在堆栈中传入函数。一旦执行离开add()
,变量a
和b
就不能再使用,并且将被jvm删除。
答案 3 :(得分:2)
当你run your program时:
main
方法执行之前,JVM会为你分配一个新的执行线程,这个线程(称为主线程)将有一个与之关联的堆栈,堆栈是局部变量的地方并放置了临时数据。obj
引用。new Heap()
时,JVM将尝试为堆内存区域中的对象分配内存。如果成功,它将为您的本地变量分配一个对象引用,如果它失败,它可能会尝试为运行垃圾收集器的对象腾出空间,如果仍然找不到足够的空间而引发OutOfMemoryError
。 add(int, int)
方法时,JVM将首先取消引用指针以获取对堆中实际对象的访问权限,如果失败则会抛出NullPointerException
,否则它将在所谓的方法区域(类信息所在的内存区域)中查找要执行的方法。 main
方法结束,其堆栈帧被删除。现在obj
引用丢失,并且不再有办法到达堆中的对象。它指向的对象现在难以收集垃圾。