当前位置: 首页 > 知识库问答 >
问题:

懒惰会阻止Java中的垃圾收集吗?

仉昂熙
2023-03-14

考虑这个类:

class Stream<A>{
        Supplier<A> headSupplier;
        Supplier<Stream<A>> tailSupplier;
        public Stream<A> take(int n) {
            return n <= 0
                    ? empty()
                    : new Stream(this.headSupplier, () -> this.tail().take(n - 1));
        }
        //other code
    }

现在考虑这个方法:

 Stream<Integer> someMethod(){
        Stream<Integer> A = ...;
        return A.take(10);
    }

在另一种方法中:

Stream<Integer> B = someMethod();

SomeMethod()返回时会发生什么?对a的引用是否仍然保留在内存中,因为我们在B上调用tail()时需要它?如果是这样,这难道不是内存泄漏或效率低下吗?我们如何防止它?

共有1个答案

邵和硕
2023-03-14

在这种设计中,create Stream对象保留对其头部供应商的引用。因此,是的,只要b流对象是活的,a对象就可以被视为活的。

从概念的角度来看:在您的示例中,您的Stream类(基本上)是某种集合。是的,集合保留对它们所包含的内容的引用。因此,只要拥有的“集合”存在,被引用的“包含”对象就不受垃圾收集的约束。

所以这不是内存泄漏:如果您决定在代码中创建b,那么您必须理解b中的内容来自哪里。

 类似资料:
  • 本文向大家介绍Java垃圾收集,包括了Java垃圾收集的使用技巧和注意事项,需要的朋友参考一下 示例 C ++方法-新增和删除 在像C ++这样的语言中,应用程序负责管理动态分配的内存所使用的内存。当使用new运算符在C ++堆中创建对象时,需要相应地使用delete运算符来处置该对象: 如果程序忘记了delete一个对象而只是“忘记”了该对象,则关联的内存将丢失给应用程序。这种情况的术语是内存泄

  • Kubernetes 垃圾收集器的角色是删除指定的对象,这些对象曾经有但以后不再拥有 Owner 了。 注意:垃圾收集是 beta 特性,在 Kubernetes 1.4 及以上版本默认启用。 Owner 和 Dependent 一些 Kubernetes 对象是其它一些的 Owner。例如,一个 ReplicaSet 是一组 Pod 的 Owner。具有 Owner 的对象被称为是 Owner

  • 问题内容: 简短形式:CMS垃圾收集器似乎无法收集数量不断增加的垃圾;最终,我们的JVM填满,应用程序变得无响应。通过外部工具(JConsole或)强制GC 清理一次。 更新:该问题似乎与JConsole的JTop插件有关。如果我们不运行JConsole,或者在没有JTop插件的情况下运行它,则该行为消失。 (技术说明:我们正在Linux 2.6.9机器上运行32位Sun JDK 1.6.0_07

  • 有人能给我解释一下原因吗?

  • JavaScript 具有自动垃圾收集机制,也就是说,执行环境会负责管理代码执行过程中使用的内存。 而在C 和C++之类的语言中,开发人员的一项基本任务就是手工跟踪内存的使用情况,这是造成许多问题的一个根源。在编写JavaScript 程序时,开发人员不用再关心内存使用问题,所需内存的分配以及无用内存的回收完全实现了自动管理。这种垃圾收集机制的原理其实很简单:找出那些不再继续使用的变量,然后释放其

  • 问题:那么扫一扫实际上是什么意思?它是实际的垃圾回收(回收无法访问的对象并释放内存?)?还是意味着什么不同? 如果是这样,如果我们省略了扫描阶段,我们会遇到什么样的麻烦?