除非您执行以下操作,否则您实际上无法在Java中“泄漏内存”:
- 实习生字符串
- 生成类
- jni调用的本机代码中的泄漏内存
- 在一些被遗忘或晦涩的地方保存对您不想要的事物的引用。
我认为您对最后一种情况感兴趣。常见方案是:
- 侦听器,尤其是内部类
- 缓存。
一个很好的例子是:
- 构建一个Swing gui,它可以启动数量不限的模态窗口;
- 让模态窗口在初始化期间执行以下操作: `
StaticGuiHelper.getMainApplicationframe().getoneOfTheButtons().addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){
// do nothing…
}
})
`
已注册的操作不执行任何操作,但是即使关闭后,它也将导致模式窗口永远在内存中徘徊,从而导致泄漏-
因为侦听器从未注销,并且每个匿名内部类对象都对其外部对象持有引用(不可见) 。更重要的是-从模态窗口引用的任何对象也有可能泄漏。
这就是为什么像EventBus这样的库默认使用弱引用的原因。
除了侦听器外,其他典型示例是缓存,但是我想不到一个很好的示例。



