在Java中导致内存泄漏的最简单方法是什么?
可能重复:
用Java创建内存泄漏
什么是导致java内存泄漏的最简单方法?
你不能真正“泄漏”Java中的内存,除非你:
我认为你对最后一种情况感兴趣。 常见的情况是:
一个很好的例子是:
StaticGuiHelper.getMainApplicationFrame().getOneOfTheButtons().addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ // do nothing... } })
注册的动作什么都不做,但是它会导致模式窗口永远留在内存中,即使在关闭之后,也会导致泄漏 - 因为听众永远不会被注销,并且每个匿名内部类对象都拥有对其外部对象的引用(不可见) 。 更重要的是,从模态窗口引用的任何对象都有可能泄漏。
这就是为什么像EventBus这样的库默认使用弱引用的原因。
除了听众,其他典型的例子是缓存,但我想不出一个好例子。
“当计算机程序消耗内存但无法将其释放回操作系统时,会发生计算机科学中的内存泄漏(或在此情况下泄漏)。” (维基百科)
简单的答案是:你不能。 Java会自动执行内存管理,并释放您不需要的资源。 你无法阻止这种情况发生。 它总是能够释放资源。 在手动内存管理程序中,这是不同的。 你不能使用malloc()在C中获得一些内存。 为了释放内存,你需要malloc返回的指针并在其上调用free()。 但是,如果你再也没有指针(被覆盖,或者超过了生命期),那么你不幸的是不能释放这些内存,因此你有内存泄漏。
到目前为止,所有其他答案在我的定义中并不是真正的内存泄漏。 他们的目标都是以真正快速的填充内容。 但是,在任何时候,您仍然可以取消引用您创建的对象,从而释放内存 - >无泄漏。 acconrad的答案非常接近,但我不得不承认,因为他的解决方案实际上是通过强制无限循环来“破坏”垃圾回收器)。
长时间的答案是:您可以通过使用JNI编写Java库来获得内存泄漏,该JNI可以手动进行内存管理,并因此存在内存泄漏。 如果你调用这个库,你的java进程会泄漏内存。 或者,您可能在JVM中存在错误,以致JVM失去内存。 在JVM中可能存在错误,甚至可能有一些已知的错误,因为垃圾收集并不是那么简单,但它仍然是一个错误。 按照设计,这是不可能的。 您可能会要求一些受此类错误影响的java代码。 对不起,我不知道它,它可能不会再成为下一个Java版本的bug了。
这是一个简单的例子
public class finalizer {
@Override
protected void finalize() throws Throwable {
while (true) {
Thread.yield();
}
}
public static void main(String[] args) {
while (true) {
for (int i = 0; i < 100000; i++) {
finalizer f = new finalizer();
}
System.out.println("" + Runtime.getRuntime().freeMemory() + " bytes free!");
}
}
}
链接地址: http://www.djcxy.com/p/3347.html
上一篇: Easiest way to cause memory leak in Java?
下一篇: Why do heap memory usage and number of loaded classes keep increasing?