Java中是否有内存泄漏?

我问了很多次这个问题。 什么是一个好的方法来回答?

编辑 :谢谢大家的所有答案。


Java中有没有内存泄漏?

答案是这取决于你在谈论什么样的内存泄漏。

经典的C / C ++内存泄漏发生在应用程序忽略freedispose对象时发生泄漏。 循环引用是这种情况的一个子情况,应用程序很难知道何时free / dispose ,而忽略这样做。 相关问题是应用程序在释放后使用对象的位置,或试图释放对象两次。 (你可以称后者存在内存泄漏问题,或者只是bug。无论哪种方式......)

Java和其他(fully1)托管语言大多不会遇到这些问题,因为GC负责释放不再可访问的对象。 (当然,悬挂指针和双重问题不存在,并且循环没有问题,因为它们是针对C / C ++“智能指针”和其他引用计数方案的。)

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

  • 程序的逻辑/状态可能会使用某些变量的执行路径不会发生。 开发人员可以看到这一点很明显,但GC不能确定,并且在谨慎的情况下(因为它是必需的)。
  • 程序员可能是错的,而GC正在避免可能导致悬而未决的引用。
  • (请注意,Java中的内存泄漏的原因可能很简单,或者很微妙;请参阅@ jonathan.cone的一些微妙的答案,最后一个可能涉及外部资源,您不应该依赖GC来处理这些资源。 )

    无论采用哪种方式,您都可能遇到不想要的对象无法被垃圾收集的情况,并且四处闲逛......内存泄漏。

    然后存在的问题是Java应用程序或库可以通过需要手动管理的本地代码分配堆外对象。 如果应用程序/库有错误或使用不正确,则可能导致本机内存泄漏。 (例如:Android位图内存泄漏...注意到这个问题已在更高版本的Android中修复。)


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


    那么,考虑到java使用垃圾收集器来收集未使用的对象,你不能有一个悬挂指针。 但是,您可以将一个对象保留在作用域中的时间超过它所需的时间,这可能被认为是内存泄漏。 更多信息,请访问:http://web.archive.org/web/20120722095536/http://www.ibm.com:80/developerworks/rational/library/05/0816_GuptaPalanki/

    你正在考虑这个还是什么? 因为那里至少有一个A +。


    是。 即使您有GC,内存泄漏仍可能发生。 例如,您可能需要手动关闭数据库结果集等资源。

    链接地址: http://www.djcxy.com/p/19899.html

    上一篇: Can there be memory leak in Java

    下一篇: How do you crash a JVM?