一道垃圾收集的题目, 为什么答案是B? 使用name=null导致的结果是变量name被指向空,而newestName仍然指向name原来指向的地址,是name的内容(内存地址的指针值)被释放,而不是它的内容。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 那"nick","jason"没有要被收回? 好像需要弄清楚一些问题了,请教了。object指的是stack中的reference?还是heap中由new申请的一段内存空间?GC释放内存时候释放指向null的reference,同时也释放heap中没有被引用的object?好像。 String name; String newName = "Nick"; newName = "Jason"; name = "Frieda"; String newestName = name; //这里newestName失去了对原先对象的引用,要收集name = null; //这里name虽然致空,但name所指的内存仍可通过newestName访问,不须收集//Line A //建议到c/c++版察看有关内存泄漏的讨论 应该只在newName = "Jason";处收集吧 谢谢各位解答,还是有点不明白:String name; String newName = "Nick"; newName = "Jason"; //这时候"Nick"应该可以被回收name = "Frieda"; String newestName = name; //newestName的原先对象"Jason"要收集name = null; //这里name虽然致空,但name所指的内存仍可通过newestName访问,不须收集//Line A 所以应该有两个要被收集 String newestName = name; //这里那要收集?这只是把name的引用给一个新的string newestName .我同意njallenwang(令狐冲冲) 只有一个。在newName = "Jason";处收集。 运行过后,newName = "Jason"newestName = "Frieda"剩下的一个 "Nick" 被 gc 收集 当然是只有一个了,这里你告诉编译器name = null; 就是说name这个变量所指向的对象你不想要了,另外两个你不说要不要,gc当然不敢动他,万一gc把newname什么的扔了,你后面要是还想用怎么办?在某个变量的命名空间里你不说不想要某样东东了,gc是不会回收他地 实际上java里面声明的变量都是指针。指向某个object,那么这个object的引用就+1,指针不再指向他了就-1,如果某个object的引用变成0了,那么垃圾收集线程就把她收了。应该是"Nick"被收集。 to sleepyworm这好像是gc工作的最初模型, 是最简单的reference counting方式,效率最不好的。现在gc的工作方式不是这样的哦。 sorry, 我看错了,原来newestName 不是newName :)感觉上收集的时候是看具体的String, 有变量参照到它就不会被收集,没有的要被收集 只有"NICK"在 newName = "Jason"; 以后可以被回收,当然只有1个了 steeven(steeven) is right. Answer is "two". 我认为应该是2个:String name; String newName = "Nick"; (name="null"被收集)newName = "Jason"; (收集"Nick")name = "Frieda"; 只有newName = "Jason"; 导致newName 原先引用的对象被回收答案 b. java文件显示图的问题,在线等 怎样按照给定的日期创建一个Date对象 java double值的问题 多态性和覆盖的问题 问牛人们一个问题 java programing language 这本书怎么样,是java之父写的 我想用jbuilder设计一个从指纹器读取指纹图像 问一个关于innner class的 问题 : 怎样在struts-1.1-b3中添加资源文件(ApplicationResources.properties)? 关于java中容器内外并发编程的疑问 怎样才能做出半透明的JMenuItem,有人会吗? 请教,请教,,,一定要看!!一定要看!!
object指的是stack中的reference?还是heap中由new申请的一段内存空间?
GC释放内存时候释放指向null的reference,同时也释放heap中没有被引用的object?好像。
String newName = "Nick";
newName = "Jason";
name = "Frieda"; String newestName = name; //这里newestName失去了对原先对象的引用,要收集name = null; //这里name虽然致空,但name所指的内存仍可通过newestName访问,不须收集
//Line A
//建议到c/c++版察看有关内存泄漏的讨论
String name;
String newName = "Nick";
newName = "Jason"; //这时候"Nick"应该可以被回收
name = "Frieda"; String newestName = name; //newestName的原先对象"Jason"要收集name = null; //这里name虽然致空,但name所指的内存仍可通过newestName访问,不须收集
//Line A
所以应该有两个要被收集
我同意njallenwang(令狐冲冲) 只有一个。在newName = "Jason";处收集。
newName = "Jason"
newestName = "Frieda"
剩下的一个 "Nick" 被 gc 收集
这里你告诉编译器name = null;
就是说name这个变量所指向的对象你不想要了,
另外两个你不说要不要,gc当然不敢动他,万一gc把
newname什么的扔了,你后面要是还想用怎么办?
在某个变量的命名空间里你不说不想要某样东东了,gc是不会回收他地
指向某个object,那么这个object的引用就+1,指针不再指向他了就-1,
如果某个object的引用变成0了,那么垃圾收集线程就把她收了。应该是"Nick"被收集。
这好像是gc工作的最初模型, 是最简单的reference counting方式,效率最不好的。
现在gc的工作方式不是这样的哦。
在 newName = "Jason";
以后可以被回收,当然只有1个了
String name;
String newName = "Nick"; (name="null"被收集)
newName = "Jason"; (收集"Nick")
name = "Frieda";
答案 b.