当前位置: 首页 > 面试题库 >

取消引用对象但仍引用其成员对象时会发生什么?

徐瀚
2023-03-14
问题内容
class ClassA {
    ClassB mem1 = new ClassB();
    ClassB mem2 = new ClassB();
}

class ClassB {
}

public class Sample {
    public static void main(String[] args) {
        ClassA obj1 = new ClassA();
        ClassB obj2 = obj1.mem1;

        obj1 = null;

        obj2 = null;
    }
}

在上面的程序中,行之后会发生什么obj1 = null

OBJ1 准备进行垃圾回收,即使其成员对象的一个仍然被引用?


问题答案:

自动垃圾回收是查看堆内存,识别正在使用的对象和未使用的对象以及删除未使用的对象的过程。使用中的对象或引用的对象意味着程序的某些部分仍维护着指向该对象的指针。程序的任何部分都不再引用未使用的对象或未引用的对象。因此,可以回收未引用对象使用的内存。

Java垃圾收集基础知识

在这种情况下,当obj1 = null;进行处理时,没有ClassA指向它所指向类型的对象的引用,因此它适合进行垃圾回收。但是ClassB,该对象mem1仍然具有形式为的引用obj2,因此至少保留该对象,直到obj2 = null;执行该行为止。



 类似资料:
  • Java对象是在堆中创建的,为了在Java中进行垃圾收集,堆被分为三个部分或三代,它们被称为堆的年轻一代、终身或老一代和永久区域。新一代被进一步划分为三个部分,称为伊甸园空间、幸存者1和幸存者2空间。当第一次在堆中创建的对象在Eden space内的新一代中创建时,如果对象幸存,则在后续的次要垃圾收集之后,在主要垃圾收集将该对象移动到旧代或终身代之前,将其移动到幸存者1,然后移动到幸存者2。 阅读

  • 问题内容: 我的老师给我一个问题: “用Java创建对象时会发生什么”。 据我所知,创建对象时会发生内存分配,变量初始化和构造函数方法调用。 但是我的老师说我几乎是对的。后面的两件事是正确的,除了内存堆。相反,他说发生了内存分配。我认为对象存储在堆中,所以我的老师错了。你这样认为吗? 问题答案: 与往常一样,找到针对此类问题的解决方案的最佳位置是Java语言规范。 具体来说,从创建新实例的部分可以

  • 问题内容: 我正在向我的朋友解释OOP。我无法回答这个问题。(我有多可耻? 我只是想逃避,因为OOP描绘了现实世界。在现实世界中,父母可以容纳孩子,但孩子不能容纳父母。OOP也是如此。我知道它很愚蠢。:P 为什么此陈述无效? 因为aChild的成员是aParent成员的超集。那为什么孩子不能容纳父母。 问题答案: 正是因为aChild是aParent功能的超集。你可以写: 因为每只狐狸都是动物。但

  • 问题内容: 我更喜欢编译时错误-为什么不是这种情况?在不提供返回类型的情况下调用相同的问题时,可以将其应用于具有返回类型的任何方法。 可以在不提供引用/变量来保存返回类型的情况下调用: 问题答案: 该对象将立即创建并有资格进行垃圾收集(即,可能很快就会被垃圾收集)。 这不是编译时错误的原因是,并非每个返回方法的方法都需要您使用该返回值。某些方法仅因其副作用而被调用。 一个很好的例子是:它返回一个对

  • 问题内容: 如果知道与该线程关联的ID,该如何获取正在运行的线程的引用? 例如 问题答案: 您有2种方法可以做到。两者都很简单: 旧方法:获取您可以循环访问..getParent()的根线程组。并打电话 较新(但速度较慢)。 第一种方法有一个小问题,由于存在错误,ThreadGroup可能根本无法枚举任何东西。 第二个比较慢,但是有安全漏洞。

  • 我已经被覆盖了hashcode和equals以查找具有相同开始日期和关闭日期的值。我得到了重复对象的类似哈希代码。当等同于这些对象时,我得到了布尔值“假”。在我的理解中,对象==对象比较对象的引用,即使引用是相同的;代码返回假。你能帮我理解是什么问题吗?我在下面发布了我的代码: Main.java 输出: 检查客户对象引用:Customer@643 对象引用(位于Map中):[Customer@6