2

晚上好,请看这段代码示例,它演示了符合 GC 条件的对象数量:

public class CardBoard {

Short story = 5;

CardBoard go(CardBoard cb) {
    cb = null;
    return cb;
}

public static void main(String[] args) {
    CardBoard c1 = new CardBoard();
    CardBoard c2 = new CardBoard();
    CardBoard c3 = c1.go(c2);
    c1 = null;
   // do Stuff

   }
}

我看到有四个对象在达到 Stuff 时符合 GC 条件,即 c3 及其关联的故事对象和 c1 及其关联的故事对象,你看到了什么?

4

1 回答 1

8

恰好有1 个对象符合 GC 条件 - 之前由c1. c3指向nullCardBoard.go()总是返回null)。

还要记住,c1变量c2只是引用,而不是对象。因此它们不需要被垃圾收集。它们生活在堆栈上,而不是堆上。

最后不要被愚弄:

CardBoard go(CardBoard cb) {
  cb = null;
  return cb;
}

这只会使cb参考(参数)无效,而不是c2参考。


Short story = 5;

是一个单独的问题。如果是,short story那么它就不会被视为一个单独的对象。ButShort是一个对象,所以技术上CardBoard指向另一个符合 GC 条件的对象。然而!由于原始包装器缓存5实际上是Short静态缓存的一部分,并且永远不适合 GC。换句话说,Short表示类型的对象5总是被static缓存引用Short

最好的部分来了。如果它是:

Short story = 5000;

那么答案将是... 2。那是因为总是返回(符合 GC 条件)Short.valueOf((short)5000)的新实例,而总是返回相同的实例。ShortShort.valueOf(5)

哇,这很棘手!

于 2013-01-12T18:55:28.430 回答