- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
关于Was内存溢出问题
名称:Class类加载器内存泄漏问题的探讨.doc 日期: 01.02.2008作者:Henry Hu 状态: Release 1
邮件:hupf@ 页数: PAGE 26 of NUMPAGES 26
关于Class类加载器
内存泄漏问题的探讨
胡鹏飞
2008-1-2
目录
TOC \o 1-3 \h \z \u
HYPERLINK \l _Toc187076375 背景 PAGEREF _Toc187076375 \h 1
HYPERLINK \l _Toc187076376 疑问:应用重启,导致内存泄漏? PAGEREF _Toc187076376 \h 3
HYPERLINK \l _Toc187076377 问题的再现 PAGEREF _Toc187076377 \h 4
HYPERLINK \l _Toc187076378 JVM GC 垃圾回收机制概述 PAGEREF _Toc187076378 \h 7
HYPERLINK \l _Toc187076379 Class类加载的基本机理 PAGEREF _Toc187076379 \h 7
HYPERLINK \l _Toc187076380 JVM GC垃圾回收和ClassLoader类加载器之间的微妙关系 PAGEREF _Toc187076380 \h 9
HYPERLINK \l _Toc187076381 ClassLoader类加载内存泄漏问题的定位 PAGEREF _Toc187076381 \h 13
HYPERLINK \l _Toc187076382 ClassLoader类加载内存泄漏问题的解决方案 PAGEREF _Toc187076382 \h 19
HYPERLINK \l _Toc187076383 参考资料: PAGEREF _Toc187076383 \h 24
背景
浪潮烟草技术人员针对广东烟草12月10日内存溢出事件进行了广泛的技术探讨,并得到了一些建设性的建议和结论。
其中重点提到了:
“
关于websphere在控制台中进行重启应用,而不是重启整个websphere,这时候静态类是不能回收的,造成些类不能销毁,占用着内存,而且这些内存是不能重复使用的,可以说是内存泄露。静态的类不能销毁,那么静态类引用的对象也不能销毁,因此一些bean都不能被正常回收,其实这些小对象占用内存是很少的,最主要的是这些类引用的缓存没有销毁,这些缓存才是占用内存的大头。如果系统用了一两天,然后有人在控制台上将这个应用重启,那么缓存将不能销毁,照成大量内存浪费,因此现在我们分析的dump文件中缓存一半的内存是由这些没有销毁的无用的缓存占用的。其实BSP中有个HttpServletContextListener,这个监听器能够在关闭应用的时候清空缓存,但是从dump文件中可以看出这个监听器可能没有在应用关闭的时候调用。
对于静态类支持有的对象销毁问题需要进行研究,解决Websphere的这种bug。
”
所以大家认为是WAS的Bug导致:在进行应用重新启动过程中,一些类的Class MetatData本身描述不能从内存中被释放,同时在LouShang烟草系统中一些系统类型的类Class进行了大量类静态变量的定义,并在这些类静态变量中存放了大量的对象。长此以往,多次重新启动应用从而大量的内存被占用,最终导致内存泄漏。
针对Java静态类的补充说明:通常一个普通类不允许声明为静态的,只有一个内部类才可以。在一个内部类中如果想提供静态方法访问的前提下,我们才会把此内部类设置为静态类。这时不需实例一个外部类和内部类,而可以直接调用内部内的静态方法。样例如下:
package com.test;
public class StaticCls {
public static void main(String[] args) {
OuterCls.InnerCls.test();
}
}
class OuterCls {
public static class InnerCls {
public static void test() {
System.out.println(InnerCls);
}
}
}
相信在LouShang烟草系统中这种静态类的应用场景并不多见,所以上面提到的静态类的说法并不准确,应该改正为:类静态变量。
虽然把“静态类”改变为“类静态变量”,但是上面提到的Class MetatData类本身描述不能从内存中
文档评论(0)