我有一个非常基本的问题,关于Java中的弱引用和强引用。
在一般的Java编程中,我们通常不创建对象的弱引用,我们创建了正常的强引用,但是当我们完成该对象时,我们将null分配给该对象,其概念是,下一次将由GC收集该对象
这是我的理解错了吗?
在阅读了一些文章后,看起来,对象是由GC收集的如果它是null或者没有在任何地方被引用,只要它有弱引用。我很迷惑。
换句话说,对于Java GC,这两个代码片段有什么区别?
Snippet 1
function Pikaday() {}
// define a method on the existing prototype
Pikaday.prototype.showYearPicker = function() {
console.log('called');
};
let pikaday = new Pikaday();
pikaday.showYearPicker(); // <-- call the function on the prototype
Snippet 2
Counter counter = new Counter(); // strong reference - line 1
WeakReference<Counter> weakCounter = new WeakReference<Counter> (counter); //weak reference
counter = null;
答案 0 :(得分:0)
不同之处在于,如果我记得正确,
第一个代码snippit在将对象计数器分配给weakCounter后将值赋给对象计数器。因此,对于旧计数器而言,weakCounter仍然可以引用计数器进行更新。但是,即使将weakCounter指定给Counter
的对象引用,编译器仍会收集计数器在第二个代码示例中,计数器从分配给对象变为空值,让java知道“嘿,你可以在垃圾中收集我!”
希望这是有道理的,如果我的一些事实有误,请帮助您理解,请随时告诉我错误的地方:)
答案 1 :(得分:0)
这两者本质上是等价的,除非您可能能够通过WeakReference引用该对象,如果您在GC收集它之前这样做。
WeakReference的目的是让你可以把它藏在某个地方(比如某种搜索索引)而不用担心如果你已经完成了对象并且希望将任何&#34; strong& #34;引用(以便可以收集对象并重用空间)。如果你使用普通的强力参考,你必须确保清除它,否则物体将永远存在。
(如Ted Hopp所述,SoftReferences在机制方面类似,只是如果存储紧张,GC只会收集引用的对象。这使得它们适用于缓存的网页等。)