gpt4 book ai didi

java - 弱引用和强引用

转载 作者:行者123 更新时间:2023-11-30 07:00:45 25 4
gpt4 key购买 nike

我有一个关于Java中弱引用和强引用的非常基本的问题。

在一般的Java编程中,我们通常不会创建对象的弱引用,我们会创建普通的强引用,但是当我们完成该对象时,我们将null分配给该对象,并认为该对象下次将被GC收集.

难道我的理解有误?

读完一些文章后,看起来,如果对象为空或只有弱引用则不会在任何地方引用,则对象会被 GC 收集。我很困惑。

换句话说,对于 Java GC,这两个代码片段有什么区别?

片段 1

Counter counter = new Counter(); // strong reference - line 1
WeakReference<Counter> weakCounter = new WeakReference<Counter> (counter); //weak reference
counter = null;

片段2

  Counter counter = new Counter(); // strong reference - line 1
counter = null;

最佳答案

在这两种情况下,计数器都符合垃圾回收的条件。即使使用了SoftReference,也会有资格被GC,但也只是勉强回收而已。 (也就是说,SoftReference 鼓励 GC 将对象保留在内存中,但仍然允许收集它。)

只有硬引用才会强制 GC 不处理对象。

通常,如果引用的生命周期比您希望的对象生命周期长,则只需将 null 分配给该引用。一旦硬引用变量超出范围,就无法再从实时代码访问它,因此它的硬引用不会阻止 GC 收集该对象。

另请注意,无法保证 GC 何时会实际收集符合收集条件的对象。它可能在下一个 GC 周期,也可能不在。这在很大程度上取决于 GC 的实现。您唯一可以肯定的是,在虚拟机抛出 OutOfMemoryError 之前,所有符合条件的对象都将被收集。

关于java - 弱引用和强引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40966271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com