计算符合GC条件的对象数量

Jav*_*yer 2 java garbage-collection scjp

晚上好,请查看此代码示例,其中显示了符合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

   }
}
Run Code Online (Sandbox Code Playgroud)

我看到有四个对象符合GC的条件,当达到了东西时,它是c3,它是关联的故事对象和c1以及它的相关故事对象,你看到了什么?

Tom*_*icz 8

正好有1个符合GC条件的对象 - 之前引用的对象c1.c3指向null(CardBoard.go()总是返回null).

还记得c1c2变量仅引用,而不是对象.因此,它们不需要被垃圾收集.他们生活在堆栈上,而不是堆积.

最后不要被愚弄:

CardBoard go(CardBoard cb) {
  cb = null;
  return cb;
}
Run Code Online (Sandbox Code Playgroud)

这只会使cb引用(参数)无效,而不是c2引用.


Short story = 5;
Run Code Online (Sandbox Code Playgroud)

是一个单独的陷阱.如果是short story那么它不会被视为一个单独的对象.但它Short是一个对象,因此在技术上CardBoard指向另一个符合GC条件的对象.然而!由于原始包装器缓存5实际上是Short静态缓存的一部分,并且从来没有真正符合GC的条件.换句话说,类型Short表示的对象5总是由static缓存引用Short.

这是最好的部分.如果它是:

Short story = 5000;
Run Code Online (Sandbox Code Playgroud)

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

哇,这太棘手了!