gpt4 book ai didi

java - SCJP 问题来确定对象何时被垃圾收集?

转载 作者:行者123 更新时间:2023-12-01 06:50:37 26 4
gpt4 key购买 nike

即使得到正确答案,我也无法弄清楚 SCJP 问题:

从以下代码(来源:http://scjptest.com)中,我们需要确定何时引用为 myInt 的对象符合垃圾回收条件:

01.public void doStuff() {  
02. Integer arr[] = new Integer[5];
03. for (int i = 0; i < arr.length; i++) {
04. Integer myInt = new Integer(i);
05. arr[i] = myInt;
06. }
07. System.out.println("end");
08.}

答案表明它在第 6 行符合 GC 条件。但我认为该对象直到第 7 行之后才符合 GC 条件。因为,被引用为 myInt 的对象也被称为 arr[i] 作为出色地。所以,你不觉得吗,因为在 myInt 超出范围之后,arr[] 仍然引用它直到第 8 行?

最佳答案

SCJP 答案的原因是第 6 行在 arr 的范围内没有剩余语句指的是它。在正常情况下,这将使数组及其元素符合垃圾回收条件。

(Java 语言规范 (12.6.1) 是这样说的:

"A reachable object is any object that can be accessed in any potential continuing computation from any live thread. Optimizing transformations of a program can be designed that reduce the number of objects that are reachable to be less than those which would naively be considered reachable. For example, a compiler or code generator may choose to set a variable or parameter that will no longer be used to null to cause the storage for such an object to be potentially reclaimable sooner. "

如您所见,可达性的真正定义实际上并不是基于范围。)


这个问题还有另一个转折......

如果他们分配了 imyInt , 自动装箱将使用 Integer.valueOf(i) ,并且该方法会记录 Integer static 中的对象缓存。此缓存会导致对象保持可访问性......

然而,Integer实例是使用 new 创建的,因此不会发生缓存。并且对象在第 6 行是不可访问的。

关于java - SCJP 问题来确定对象何时被垃圾收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5515050/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com