gpt4 book ai didi

java - Java中是否存在内存泄漏

转载 作者:IT老高 更新时间:2023-10-28 20:57:57 26 4
gpt4 key购买 nike

我多次被问到这个问题。有什么好的回答方式

最佳答案

Can there be memory leak in Java?

答案是取决于你说的是哪种内存泄漏。

经典 C/C++ 内存泄漏发生在应用程序在完成对象后忽略 freedispose 对象并泄漏。循环引用是这种情况的一个子情况,应用程序很难知道何时free/dispose,因此忽略了这样做。相关问题是应用程序在对象被释放后使用它,或者尝试两次释放它。 (你可以把后面的问题称为内存泄漏,或者只是错误。无论哪种方式......)

Java 和其他(完全1)托管语言大部分不会遇到这些问题,因为 GC 负责释放不再可访问的对象。 (当然,悬空指针和双释放问题不存在,循环也不像 C/C++“智能指针”和其他引用计数方案那样有问题。)

但在某些情况下,Java 中的 GC 会遗漏(从程序员的角度来看)应该被垃圾回收的对象。当 GC 无法确定无法到达对象时会发生这种情况:

  • 程序的逻辑/状态可能会导致使用某些变量的执行路径不会出现。开发人员可以将其视为显而易见的,但 GC 无法确定,并且会谨慎行事(因为这是必需的)。
  • 程序员可能错了,GC 正在避免可能导致悬空引用的情况。

(请注意,Java 中内存泄漏的原因可能很简单,也可能非常微妙;请参阅@jonathan.cone 对一些微妙的回答。最后一个可能涉及您不应该的外部资源> 无论如何都要依靠 GC 来处理。)

无论哪种情况,您都可能遇到无法对不需要的对象进行垃圾收集的情况,并且会占用内存……内存泄漏。

然后是Java应用程序或库可以通过需要手动管理的 native 代码分配堆外对象的问题。如果应用程序/库有错误或使用不正确,您可能会遇到 native 内存泄漏。 (例如:Android Bitmap memory leak ...请注意,此问题已在更高版本的 Android 中得到修复。)


1 - 我指的是几件事。一些托管语言允许您编写非托管代码,您可以在其中创建经典存储泄漏。其他一些托管语言(或更准确地说是语言实现)使用引用计数而不是正确的垃圾收集。基于引用计数的存储管理器需要一些东西(即应用程序)来打破循环......否则就会发生存储泄漏。

关于java - Java中是否存在内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4987357/

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