gpt4 book ai didi

java - Java内存泄漏的基础知识

转载 作者:搜寻专家 更新时间:2023-11-01 03:57:20 27 4
gpt4 key购买 nike

我读到 Java is passed by value .假设我们有这段代码,并且 HashMap somehashMap 的生命周期比 foo 长。所以 foo 不允许被垃圾收集,即使它已经完成了它的工作只是因为我们把 foo 放在 Map 中然后忘记从它删除。现在按照我链接到的帖子中答案的逻辑,我们实际上是将 foo 的引用副本传递给方法 put() 对吗?在那将 foo 放入 HashMap 中的情况不应阻止它被垃圾收集。你能帮我理解这里发生了什么吗?我到底错过了什么?

 public void someMethod(){
Foo foo = new Foo();
somehashMap.put(fooKey,foo);
}

最佳答案

垃圾收集不适用于引用,而是适用于驻留在堆中的实际 对象。当您将 foo 放入 Map 中时,您基本上是在帮助它“逃离”其当前范围,并将其置于与 相同的范围/生命周期中somehashMap.

Java 中的引用是在幕后透明地处理的。当您将 foo 引用放入映射中时,reference 的副本实际上被传递给 put 方法调用,但底层对象即 new Foo() 对于原始和复制的引用是相同的。让我们看看下面的片段:

public void doIt() {
Object f1 = new Object();
Object f2 = f1;
Object f3 = f2;
}

在上面的代码片段中,有多少对象在 doIt 执行完成后被垃圾回收了?它只是我们创建的单个 new Object()。其余都是简单的引用或别名,用于指向同一对象。

关于java - Java内存泄漏的基础知识,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11741128/

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