使用name=null导致的结果是变量name被指向空,而newestName仍然指向name原来指向的地址,是name的内容(内存地址的指针值)被释放,而不是它的内容。

解决方案 »

  1.   

    那"nick","jason"没有要被收回?
      

  2.   

    好像需要弄清楚一些问题了,请教了。
    object指的是stack中的reference?还是heap中由new申请的一段内存空间?
    GC释放内存时候释放指向null的reference,同时也释放heap中没有被引用的object?好像。
      

  3.   

    String name; 
    String newName = "Nick"; 
    newName = "Jason"; 
    name = "Frieda"; String newestName = name; //这里newestName失去了对原先对象的引用,要收集name = null; //这里name虽然致空,但name所指的内存仍可通过newestName访问,不须收集
    //Line A 
    //建议到c/c++版察看有关内存泄漏的讨论
      

  4.   

    应该只在newName = "Jason";处收集吧
      

  5.   

    谢谢各位解答,还是有点不明白:
    String name; 
    String newName = "Nick"; 
    newName = "Jason"; //这时候"Nick"应该可以被回收
    name = "Frieda"; String newestName = name; //newestName的原先对象"Jason"要收集name = null; //这里name虽然致空,但name所指的内存仍可通过newestName访问,不须收集
    //Line A 
    所以应该有两个要被收集
      

  6.   

    String newestName = name; //这里那要收集?这只是把name的引用给一个新的string newestName .
    我同意njallenwang(令狐冲冲) 只有一个。在newName = "Jason";处收集。
      

  7.   

    运行过后,
    newName = "Jason"
    newestName = "Frieda"
    剩下的一个 "Nick" 被 gc 收集
      

  8.   

    当然是只有一个了,
    这里你告诉编译器name = null; 
    就是说name这个变量所指向的对象你不想要了,
    另外两个你不说要不要,gc当然不敢动他,万一gc把
    newname什么的扔了,你后面要是还想用怎么办?
    在某个变量的命名空间里你不说不想要某样东东了,gc是不会回收他地
      

  9.   

    实际上java里面声明的变量都是指针。
    指向某个object,那么这个object的引用就+1,指针不再指向他了就-1,
    如果某个object的引用变成0了,那么垃圾收集线程就把她收了。应该是"Nick"被收集。
      

  10.   

    to sleepyworm
    这好像是gc工作的最初模型, 是最简单的reference counting方式,效率最不好的。
    现在gc的工作方式不是这样的哦。
      

  11.   

    sorry, 我看错了,原来newestName 不是newName :)感觉上收集的时候是看具体的String, 有变量参照到它就不会被收集,没有的要被收集
      

  12.   

    只有"NICK"
    在 newName = "Jason"; 
    以后可以被回收,当然只有1个了
      

  13.   

    steeven(steeven) is right.  Answer is "two".
      

  14.   

    我认为应该是2个:
    String name; 
    String newName = "Nick"; (name="null"被收集)
    newName = "Jason"; (收集"Nick")
    name = "Frieda"; 
      

  15.   

    只有newName = "Jason"; 导致newName 原先引用的对象被回收
    答案 b.