小编典典
Java中会不会发生内存泄漏?
答案是,这取决于您正在谈论的是哪种内存泄漏。
经典C / C
++内存泄漏是在应用程序free或dispose对象完成使用后忽略时发生的,并且会泄漏。循环引用是这种情况的一个子案例,其中应用程序很难知道何时使用free/
dispose,因此忽略了这样做。相关问题是应用程序在释放对象后使用对象,或尝试释放对象两次。(您可以将后者称为内存泄漏,或者仅是错误。无论哪种方式……)
Java和其他(完全1)托管语言 大多 不会受到这些问题的困扰,因为GC负责释放不再可访问的对象。(当然,不存在悬空的指针和双精度问题,并且循环对于C
/ C ++“智能指针”和其他引用计数方案而言也不成问题。)
但是在某些情况下,Java中的GC会丢失对象(从程序员的角度来看)应该被垃圾回收的对象。当GC无法确定无法访问对象时,会发生这种情况:
程序的逻辑/状态可能使得使用某些变量的执行路径不会出现。开发人员可以看到这很明显,但是GC不能确定,并且在谨慎方面会犯错误(这是必需的)。
程序员对此可能是错的,并且GC正在避免可能导致悬挂引用的内容。
(请注意,Java中内存泄漏的原因可能很简单,也可能很细微;请参见@ jonathan.cone的一些细微问题的答案。最后一个可能涉及外部资源,无论如何您
都不应 依赖于GC。 )
无论哪种方式,您都可能遇到无法垃圾收集不需要的对象的情况,并四处闲逛占用内存…内存泄漏。
然后就是Java应用程序或库可以通过需要手动管理的本机代码分配堆外对象的问题。如果应用程序/库有错误或使用不正确,则可能会发生本机内存泄漏。 …指出此问题已在更高版本的Android中修复。)
1-我暗示了几件事。某些托管语言允许您编写非托管代码,在其中可以创建经典的存储泄漏。其他一些托管语言(或更准确地说是语言实现)使用引用计数而不是适当的垃圾收集。基于引用计数的存储管理器需要某些东西(即应用程序)来中断周期……否则将导致存储泄漏。
2020-11-13