Java对象是在堆中创建的,为了在Java中进行垃圾收集,堆被分为三个部分或三代,它们被称为堆的年轻一代、终身或老一代和永久区域。新一代被进一步划分为三个部分,称为伊甸园空间、幸存者1和幸存者2空间。当第一次在堆中创建的对象在Eden space内的新一代中创建时,如果对象幸存,则在后续的次要垃圾收集之后,在主要垃圾收集将该对象移动到旧代或终身代之前,将其移动到幸存者1,然后移动到幸存者2。
阅读更多:http://javarevisited.blogspot.com/2011/04/garbage-collection-in-java.html#ixzz2MeKK2gBA
所以我的问题是,在这些移动操作之后,内存中的地址应该被更改,为什么对象引用仍然有效?
地址不会更改,因为正在移动的是对象引用,而不是对象。
Java中的对象引用是一个抽象的概念。它们不仅仅是像C指针一样表示内存偏移的整数。Java虚拟机抽象了对它指向的对象的访问,因此您不必担心JVM如何在内部管理其内存。
如果GC决定移动一个对象,它有责任更新对该对象的所有引用。
这对Java程序员来说是透明的:他们可以将引用视为抽象句柄,而不必担心JVM如何管理对象存储。
问题内容: 在上面的程序中,行之后会发生什么? 是 OBJ1 准备进行垃圾回收,即使其成员对象的一个仍然被引用? 问题答案: 自动垃圾回收是查看堆内存,识别正在使用的对象和未使用的对象以及删除未使用的对象的过程。使用中的对象或引用的对象意味着程序的某些部分仍维护着指向该对象的指针。程序的任何部分都不再引用未使用的对象或未引用的对象。因此,可以回收未引用对象使用的内存。 Java垃圾收集基础知识 在
缺少和200000个对象。 我不知道为什么JVM知道这些对象不会被使用,也不知道为什么JVM判断这个GC根不是引用。
在下面的代码中,我创建了电影类的3个实例。我已经为这三个对象分配了一些数据。其次,我创建了对对象movie1(movie4)的第二个引用。我还为电影4的属性赋值。我打印了电影1的新属性,但内容没有改变。为什么会发生这种情况?确切的原因是什么?我知道更新内容的其他方法,但我想知道为什么第二次引用不起作用 内容是movie1,但仍然相同。为什么?
问题内容: 我更喜欢编译时错误-为什么不是这种情况?在不提供返回类型的情况下调用相同的问题时,可以将其应用于具有返回类型的任何方法。 可以在不提供引用/变量来保存返回类型的情况下调用: 问题答案: 该对象将立即创建并有资格进行垃圾收集(即,可能很快就会被垃圾收集)。 这不是编译时错误的原因是,并非每个返回方法的方法都需要您使用该返回值。某些方法仅因其副作用而被调用。 一个很好的例子是:它返回一个对
问题内容: 什么是Java中的对象引用变量? 参考变量是否保存对象的内存地址? 我很困惑。请说明一下。 问题答案: 我不确定我是否有能力正确回答这个问题,但是… 对象是类的实例,它存储在内存中的某些位置 引用是用来描述指向对象所在的内存位置的指针的。 变量是一种可以访问应用程序中该内存位置的方法(其值为“变量”)。尽管变量只能指向单个内存地址(如果不为空),则在应用程序的整个生命周期中,它可能会更