TSS翻译:常见的Java内存问题第一部分

本文概述了Java应用程序中最常见的六种内存泄漏问题,包括线程局部变量、可变的静态字段和集合、循环与复杂引用、JNI内存泄漏、类的Equals/hashcode不正确实现及类加载器引起的内存泄漏,并提供了相应的解决建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TSS翻译:常见的Java内存问题第一部分

原文链接:http://www.theserverside.com/news/thread.tss?thread_id=62217

http://blog.dynatrace.com/2011/04/20/the-top-java-memory-problems-part-1/


内存和垃圾收集器一直是Java应用程序最值得关注的问题之一。当我们对javaJVM的内存收集机制而津津乐道的时候,恐怕大多数人又对GC垃圾收集的机制莫讳如深。dynaTraceMichael Kopp 也有同感,不过他把引起java内存泄漏的主要原因列出来了。

<!--[if !supportLists]-->1、<!--[endif]-->线程局部变量 Thread Local Variables

主要是在使用线程池的情况下容易出现,使用heap dump 容易找出问题所在;

2、<!--[endif]-->可变的静态字段和集合Mutable static fields and collections

避免这种情况的很简单少用。A good architectural rule is not to use mutable static objects at all, most of the time there is a better alternative.

3、<!--[endif]-->循环和复杂的双向引用Circular and complex bi-directional references

对方举了一个经典的例子:

org.w3c.dom.Document doc = readXmlDocument();
org.w3c.dom.Node child = doc.getDocumentElement().getFirstChild();
doc.removeNode(child);
doc = null;

<!--[if !supportLists]-->4、<!--[endif]-->JNI内存泄漏 JNI memory leaks

用的不多,不多说了。

<!--[if !supportLists]-->5、<!--[endif]-->类的 Equals/hashcode 不正确的实现

这样的类使用HashMap容易的时候容易出问题。

避免这种情况的方法是做测试,比如这个工具:http://code.google.com/p/equalsverifier/


<!--[if !supportLists]-->6、<!--[endif]-->类加载器引起的内存泄漏

Class Loader 的层面比较底层,一般是应用程序服务器和OSGi 容器中容易出现。

也许回复更精彩,把1,2,6综合起来了:

static ThreadLocal myWrapper =
new ThreadLocal() {
NotThreadSafeObject initialValue() {
return new NotThreadSafeObject();
}
}


myWrapper.get().someMethod()

More details at http://www.szegedi.org/articles/memleak.html

如何使用:dynaTrace 见这里:

http://blog.dynatrace.com/2011/04/13/application-performance-monitoring-in-production-a-step-by-step-guide/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值