当前位置: 首页 > 知识库问答 >
问题:

Java中垃圾收集的合格变量

王高邈
2023-03-14

我正在准备OCPJP,我被困在下面的模拟考试题中:

给定:

3. interface Animal { void makeNoise(); }

4. class Horse implements Animal {
5.     Long weight = 1200L;
6.     public void makeNoise() { System.out.println("whinny"); }
7. }

8. public class Icelandic extends Horse {
9.     public void makeNoise() { System.out.println("vinny"); }

10.    public static void main(String[] args) {
11.        Icelandic i1 = new Icelandic();
12.        Icelandic i2 = new Icelandic();
12.        Icelandic i3 = new Icelandic();
13.        i3 = i1; i1 = i2; i2 = null; i3 = i1;
14.    }
15. }

当到达第14行时,有多少对象符合垃圾回收器的条件?

A.0

B.1

C.2

D.3

E.4

F.6

他们的正确答案是E,即四个物体,但我不确定为什么。在我看来,i2及其重量将符合垃圾收集的条件。也许我遗漏了什么,请告诉我。

共有3个答案

窦哲彦
2023-03-14

系统中将有4个对象,3个Icelandic实例和1个Long实例。

当您将常量对象分配给某个变量时,编译器使用一种私有静态最终Long 1200=Long.valueOf(1200L);对象,该对象由所有权重实例共享。

原语类型包装是不可变的,所以进行这种优化是安全的。

编辑:可能我错了,因为如果我们在这里多次引用同一个常数,这种方法会起作用,但事实并非如此

皮献
2023-03-14

让我们把创建的第一个冰岛对象称为“A”,第二个称为“B”,第三个称为“C”。在第12行之后,它们分别被i1、i2和i3引用。

现在,我们做到了:

i3 = i1; // object "C" is no longer referenced, object "A" is now referenced by i1 and i3
i1 = i2; // object "A" is just referenced by i3, object "B" is referenced by i1 and i2
i2 = null; // object "B" is just referenced by i1 now
i3 = i1; // object "B" is referenced by i1 and i3, object "A" is no longer referenced

因此,对象“A”和“C”不再被引用,它们及其“权重”符合垃圾回收机制,因此总共有四个对象。

乜裕
2023-03-14

让我们在第11行IceA、第12行ICE上调用Icelandic(),以此类推。

创造之后

i1 = IceA
i2 = IceB
i3 = IceC

i3=i1之后

i1 = IceA
i2 = IceB
i3 = IceA

i1=i2之后

i1 = IceB
i2 = IceB
i3 = IceA

i2=null之后

i1 = IceB
i2 = null
i3 = IceA

i3=i1之后

i1 = IceB
i2 = null
i3 = IceB

因此,只有在第12行创建的Icelandic()。现在,每个Icelandic()都有一个Long weight,因此IceAIceC现在都没有引用,这意味着GC可以使用4个对象(IceAIceA.weightIceC.weight)。

  1. args仍然是args,在这个问题中,它们不算超出范围
  2. Long weight不是静态声明的,因此类的每个实例都有一个weight对象

 类似资料:
  • 本文向大家介绍Java垃圾收集,包括了Java垃圾收集的使用技巧和注意事项,需要的朋友参考一下 示例 C ++方法-新增和删除 在像C ++这样的语言中,应用程序负责管理动态分配的内存所使用的内存。当使用new运算符在C ++堆中创建对象时,需要相应地使用delete运算符来处置该对象: 如果程序忘记了delete一个对象而只是“忘记”了该对象,则关联的内存将丢失给应用程序。这种情况的术语是内存泄

  • Kubernetes 垃圾收集器的角色是删除指定的对象,这些对象曾经有但以后不再拥有 Owner 了。 注意:垃圾收集是 beta 特性,在 Kubernetes 1.4 及以上版本默认启用。 Owner 和 Dependent 一些 Kubernetes 对象是其它一些的 Owner。例如,一个 ReplicaSet 是一组 Pod 的 Owner。具有 Owner 的对象被称为是 Owner

  • 有人能给我解释一下原因吗?

  • JavaScript 具有自动垃圾收集机制,也就是说,执行环境会负责管理代码执行过程中使用的内存。 而在C 和C++之类的语言中,开发人员的一项基本任务就是手工跟踪内存的使用情况,这是造成许多问题的一个根源。在编写JavaScript 程序时,开发人员不用再关心内存使用问题,所需内存的分配以及无用内存的回收完全实现了自动管理。这种垃圾收集机制的原理其实很简单:找出那些不再继续使用的变量,然后释放其

  • 问题:那么扫一扫实际上是什么意思?它是实际的垃圾回收(回收无法访问的对象并释放内存?)?还是意味着什么不同? 如果是这样,如果我们省略了扫描阶段,我们会遇到什么样的麻烦?

  • 我知道对象存储在堆内存中。每个应用程序都有自己的堆内存,这是真的吗? 调用是否会降低应用程序的性能并降低应用程序的速度?或者,每当JVM完成垃圾收集时,它会降低应用程序的性能,并会使应用程序工作缓慢? 在哪些情况下进行部分垃圾回收,何时进行主要垃圾回收?