Java 关于我的OCA考试垃圾收集的问题 class硬纸板{ 短篇小说=200; 卡纸围棋(卡纸cb){ cb=null; 返回cb; } 公共静态void main(字符串[]args){ 纸板c1=新纸板(); 纸板c2=新纸板(); 纸板c3=c1.go(c2); c1=零; //当达到该行时,符合GC条件的是什么。 } }

Java 关于我的OCA考试垃圾收集的问题 class硬纸板{ 短篇小说=200; 卡纸围棋(卡纸cb){ cb=null; 返回cb; } 公共静态void main(字符串[]args){ 纸板c1=新纸板(); 纸板c2=新纸板(); 纸板c3=c1.go(c2); c1=零; //当达到该行时,符合GC条件的是什么。 } },java,garbage-collection,Java,Garbage Collection,有人能解释一下这里发生了什么吗?我知道c1和Short符合垃圾收集器的条件。但是c2会发生什么?为什么c3不也适用于它?我可能会在这里监督一些事情,但我会为每一个有助于我绕开这个话题的输入感到高兴。我的OCA考试下周就要开始了,我在这方面仍然有困难 编辑:符合GC条件的注释。考虑到Java是按值传递的,我们知道Java不是传递对象,而是传递对对象的引用 正因为如此,当你做了c3=c1.go(c2),方法go(cb)只是将c2的参考值复制到cb,因此c2不会受到cb=null的影响。因此,c2不符

有人能解释一下这里发生了什么吗?我知道
c1
Short
符合垃圾收集器的条件。但是
c2
会发生什么?为什么
c3
不也适用于它?我可能会在这里监督一些事情,但我会为每一个有助于我绕开这个话题的输入感到高兴。我的OCA考试下周就要开始了,我在这方面仍然有困难


编辑:符合GC条件的注释。

考虑到Java是按值传递的,我们知道Java不是传递对象,而是传递对对象的引用

正因为如此,当你做了
c3=c1.go(c2)
,方法
go(cb)
只是将c2的参考值复制到cb,因此c2不会受到
cb=null的影响。因此,c2不符合GC的要求


c3永远不会被构造为对象,它只是一个初始化为null类型的变量。因此,它不能被垃圾收集,因为它甚至不是在堆上创建的。

也许可视化所涉及的对象会有所帮助。在主要的第一次陈述之后,我们有:

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+
         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c2 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+
         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c2 ----> |-----------|  /     |-------|
     --> |  story    | /      |  200  |
    /    +-----------+        +-------+
   / 
  /
cb
         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c2 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+
    
  
cb --x    
         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c2 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+
    

c3 --x
         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 -x    |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c2 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+
    

c3 -x    
在第二次主要发言之后,我们有:

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+
         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c2 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+
         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c2 ----> |-----------|  /     |-------|
     --> |  story    | /      |  200  |
    /    +-----------+        +-------+
   / 
  /
cb
         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c2 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+
    
  
cb --x    
         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c2 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+
    

c3 --x
         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 -x    |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c2 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+
    

c3 -x    
(理论上,两张纸板也可能共享
Short
对象,
Short.valueOf的Javadoc表示:

此方法将始终缓存-128到127(含)范围内的值,并且可能缓存此范围之外的其他值

但是,JDK实现只缓存-128到127范围内的缓存,因此我们将假设继续)

进入go()方法后,我们有:

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+
         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c2 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+
         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c2 ----> |-----------|  /     |-------|
     --> |  story    | /      |  200  |
    /    +-----------+        +-------+
   / 
  /
cb
         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c2 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+
    
  
cb --x    
         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c2 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+
    

c3 --x
         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 -x    |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c2 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+
    

c3 -x    
在离开go()之前,我们有:

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+
         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c2 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+
         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c2 ----> |-----------|  /     |-------|
     --> |  story    | /      |  200  |
    /    +-----------+        +-------+
   / 
  /
cb
         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c2 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+
    
  
cb --x    
         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c2 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+
    

c3 --x
         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 -x    |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c2 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+
    

c3 -x    
在第三次主要声明之后,我们有:

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+
         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c2 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+
         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c2 ----> |-----------|  /     |-------|
     --> |  story    | /      |  200  |
    /    +-----------+        +-------+
   / 
  /
cb
         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c2 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+
    
  
cb --x    
         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c2 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+
    

c3 --x
         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 -x    |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c2 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+
    

c3 -x    
在离开main()之前,我们有:

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+
         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c2 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+
         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c2 ----> |-----------|  /     |-------|
     --> |  story    | /      |  200  |
    /    +-----------+        +-------+
   / 
  /
cb
         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c2 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+
    
  
cb --x    
         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c2 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+
    

c3 --x
         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c1 -x    |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+

         +-----------+        +-------+
         | CardBoard |   ---> | Short |
c2 ----> |-----------|  /     |-------|
         |  story    | /      |  200  |
         +-----------+        +-------+
    

c3 -x    

正如我们所看到的,在分配的4个对象中,有2个仍然可以访问,有2个符合收集条件。

相关:我希望我对您问题的回答能更清楚地说明这一点。我也在为下周的亚奥理事会考试做准备。因此,如果您有任何其他与OCA相关的问题;请问他们,我会尽我最大的努力回答他们:你的问题似乎不完整:你说的是垃圾收集在哪个时间点的有效性?@meriton我改变了它!这些问题毫无意义,垃圾收集器就在那里,因此开发人员不需要对这些问题进行推理,但更糟糕的是,预期的答案通常是根本错误的。正式正确的答案是,此代码中所有可见的对象都有资格进行垃圾收集,因为后续代码不会接触任何对象。值得一读:啊!现在我明白了!我知道c2从未受到“伤害”,因为cb将自身分配为null,但没有从c2中删除引用。你最后一句话让我明白了。没有为c3创建对象,因此没有要收集的内容。现在有道理了,谢谢你@洛斯基尔很高兴我能帮上忙!对于任何其他与OCA相关的问题,您可以随时向我发送消息!这对我们双方来说都是一个很好的练习。就像来自
OCA
的任何其他与GC相关的问题一样,这个问题很愚蠢。如果该代码是整个应用程序中唯一的代码,则所有代码都符合GC要求。@Eugene可能是这样,但我确信这是他们对OCA GC问题的首选思维方式,因此这是正确的答案……如果提供的代码是我们应该知道的唯一代码,则所有代码都符合GC要求,因为没有人真正使用任何创建的实例。如果我们采取假装局部变量通常会阻止垃圾收集的方式,即忽略中这样的矛盾的真实示例,我们仍然不应该忽略
c1=null语句…“这不会发生,因为main()显然不是热点”-垃圾回收在这一点上无论如何都不会发生,因为没有内存分配可能触发它,应用程序将退出并释放整个堆内存。HotSpot JVM需要编译来识别这种形式上无法访问的对象,这是一个实现细节。因此,形式上正确的答案是,此时所有对象都有资格进行垃圾收集,而实际的答案是,此时不会收集任何对象。两者都不符合考试的要求…@meriton“合格”基于什么?如上所述,根据规范,所有对象都是合格的。如果一个实现没有收集所有对象,那是由于实现特定的行为,比如一些引用被认为在解释模式下可能是可访问的。或为并发收集器配置的暂停时间目标。或者……考虑到特定于实现的限制的问题需要指定哪些实现、配置、当前内存和时间限制等。无论您选择什么组合,真正的答案永远不会与天真的“正确”答案相匹配。@meriton这一点已经在中解释过,该规范说:“可访问对象是可以从任何活动线程在任何可能的连续计算中访问的任何对象。”缺少引用是一个易于检查的没有潜在访问的证明,但相反的情况并不成立,引用的存在并不意味着可访问性。您的“验证”当你改变程序时,这是毫无意义的。