弱参考和强参考

时间:2016-12-05 02:30:54

标签: java collections garbage-collection weak-references

我有一个非常基本的问题,关于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;

2 个答案:

答案 0 :(得分:0)

不同之处在于,如果我记得正确,

第一个代码snippit在将对象计数器分配给weakCounter后将值赋给对象计数器。因此,对于旧计数器而言,weakCounter仍然可以引用计数器进行更新。但是,即使将weakCounter指定给Counter

的对象引用,编译器仍会收集计数器

在第二个代码示例中,计数器从分配给对象变为空值,让java知道“嘿,你可以在垃圾中收集我!”

希望这是有道理的,如果我的一些事实有误,请帮助您理解,请随时告诉我错误的地方:)

答案 1 :(得分:0)

这两者本质上是等价的,除非您可能能够通过WeakReference引用该对象,如果您在GC收集它之前这样做。

WeakReference的目的是让你可以把它藏在某个地方(比如某种搜索索引)而不用担心如果你已经完成了对象并且希望将任何&#34; strong& #34;引用(以便可以收集对象并重用空间)。如果你使用普通的强力参考,你必须确保清除它,否则物体将永远存在。

(如Ted Hopp所述,SoftReferences在机制方面类似,只是如果存储紧张,GC只会收集引用的对象。这使得它们适用于缓存的网页等。)