首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java Standard API中的内存泄漏陷阱

Java Standard API中的内存泄漏陷阱
EN

Stack Overflow用户
提问于 2009-08-15 09:48:05
回答 6查看 8.6K关注 0票数 50

当以不正确的方式使用时,Java Standard API的哪些类会导致内存泄漏?如何避免/修复这些内存泄漏?

例如:、ObjectInputStreamObjectOutputStream保留对他们所见过的所有对象的引用,以便将同一对象的后续出现作为引用而不是副本发送(从而处理循环引用)。当您无限期地保持这样的流打开时(例如,当使用它通过网络通信时),这会导致内存泄漏。

修复:定期或在每个顶级对象之后调用reset()。

EN

回答 6

Stack Overflow用户

发布于 2009-08-15 10:01:59

一个很大的问题是,获取Java字符串的子字符串引用了原始字符串。

示例:读入一个3000个字符的记录,得到一个12个字符的子字符串,并将其返回给调用者(在同一个JVM中)。即使您没有直接引用原始字符串,该12个字符的字符串在内存中仍使用3000个字符。

对于接收并解析大量消息的系统来说,这可能是一个真正的问题。

有几种方法可以避免这种情况:

代码语言:javascript
复制
String sub = new String(str.substring(6,12));

代码语言:javascript
复制
String sub = str.substring(6,12).intern();

第一个更加清晰。第二个还有其他含义,因为您使用的是PermGen空间。过度使用你可能会用完,除非你给你的VM足够的。

请记住,只有当你使用较小的子串,然后丢弃原始字符串,并且你经常这样做时,这才是相关的。

票数 49
EN

Stack Overflow用户

发布于 2009-08-15 10:26:07

您注册为事件接收者的所有内容,例如在GUI框架中,只要它是注册的并且事件源是活动的,就不能被垃圾回收。

如果开发人员没有意识到从事件源到事件订阅者的强引用,这可能会引入内存泄漏。

票数 8
EN

Stack Overflow用户

发布于 2009-08-15 12:53:36

任何你持有的非静态内部类都是外部类。因此,看起来很简单内部类可以保持一个巨大的对象图。将实例放在某个静态的或应用程序范围的集合中,您将使用大量本不应该使用的内存。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1281549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档