当以不正确的方式使用时,Java Standard API的哪些类会导致内存泄漏?如何避免/修复这些内存泄漏?
例如:、ObjectInputStream
和ObjectOutputStream
保留对他们所见过的所有对象的引用,以便将同一对象的后续出现作为引用而不是副本发送(从而处理循环引用)。当您无限期地保持这样的流打开时(例如,当使用它通过网络通信时),这会导致内存泄漏。
修复:定期或在每个顶级对象之后调用reset()。
发布于 2009-08-15 10:01:59
一个很大的问题是,获取Java字符串的子字符串引用了原始字符串。
示例:读入一个3000个字符的记录,得到一个12个字符的子字符串,并将其返回给调用者(在同一个JVM中)。即使您没有直接引用原始字符串,该12个字符的字符串在内存中仍使用3000个字符。
对于接收并解析大量消息的系统来说,这可能是一个真正的问题。
有几种方法可以避免这种情况:
String sub = new String(str.substring(6,12));
或
String sub = str.substring(6,12).intern();
第一个更加清晰。第二个还有其他含义,因为您使用的是PermGen空间。过度使用你可能会用完,除非你给你的VM足够的。
请记住,只有当你使用较小的子串,然后丢弃原始字符串,并且你经常这样做时,这才是相关的。
发布于 2009-08-15 10:26:07
您注册为事件接收者的所有内容,例如在GUI框架中,只要它是注册的并且事件源是活动的,就不能被垃圾回收。
如果开发人员没有意识到从事件源到事件订阅者的强引用,这可能会引入内存泄漏。
发布于 2009-08-15 12:53:36
任何你持有的非静态内部类都是外部类。因此,看起来很简单内部类可以保持一个巨大的对象图。将实例放在某个静态的或应用程序范围的集合中,您将使用大量本不应该使用的内存。
https://stackoverflow.com/questions/1281549
复制相似问题