Java应用程序中完全没有内存泄漏?

可能重复:
用Java创建内存泄漏

Java中有一个“垃圾收集器”,但这是否意味着Java应用程序中完全没有内存泄漏? 如果不是,他们如何以及为何发生?

我对使用JavaSE的应用程序中的场景更感兴趣。


否 - 内存泄漏仍然可以在Java中存在。 他们只是一种“不同类型”。

维基:内存泄漏

计算机科学中的内存泄漏(在这种情况下是泄漏)发生在计算机程序消耗内存但无法将内存释放回操作系统时

在Java的情况下(通常),当一个未使用/不需要的对象永远不符合回收的条件时。 例如,一个对象可能被隐藏在一个全局列表中,并且即使该对象以后从未被访问过也不会被删除。 在这种情况下,JVM不会释放对象/内存 - 它不能 - 因为稍后可能需要该对象,即使它永远不会。

(顺便说一下,一些对象,比如直接分配的ByteBuffers也会消耗“JVM堆内存”,由于终结器和内存压力的原因,这些内存可能无法及时回收。)

就Java而言,“内存泄漏”是一个语义问题,而不是“在任何情况下都无法释放”的问题。 当然,有错误的JNI / JNA代码,所有投注都关闭;-)

快乐的编码。


取决于你如何定义内存泄漏。

如果您具体指分配的内存不再由某个内存根引用,那么不会,垃圾收集器将最终清除所有这些内存。

如果你的意思是通常让你的内存占用量无限增长,那很容易。 只是有一些静态字段引用的集合,并不断添加到。


java中的内存泄漏是非常有可能的。 这里有一篇很好的文章,它有一个使用核心Java的例子。 从根本上讲,当垃圾收集器无法回收对象时,会发生内存泄漏,因为应用程序持有对它的引用,即使该对象本身可能不再使用,它​​仍不会释放。 在java中创建内存泄漏的最简单方法是让应用程序对某些内容进行引用,但不使用它。

在这个例子中,未使用的对象是一个静态的List,并且向该列表添加东西最终会导致JVM耗尽内存。 静态集合是“泄漏”的一个相当常见的来源,因为它们通常是长寿命和可变的。

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

上一篇: Are memory leaks totally absent in Java applications?

下一篇: What are GC roots for classes?