Atitit.提升稳定性-----分析内存泄漏PermGen OOM跟解决之道...java

Atitit.提升稳定性-----分析内存泄漏PermGen OOM跟解决之道...java

1. 内存区域的划分 1

2. PermGen内存溢出深入分析 1

3. PermGen OOM原因总结 2

4. 常见的类载入器和类型卸载的可能性总结 2

5. PermGen内存溢出的应对措施 3

6. 另外一种就是使用oracleBEA JDK,由于这个里面的JVM没有PermGen space 3

7. 參考 3

1. 内存区域的划分

java的内存泄漏基本上依照内存区域的划分能够分为:

1 堆(heap)内存泄漏:大家都比較熟悉

2 栈(stack)内存泄漏:当前线程执行期间维护的中间变量等信息过多。比如常见的死循环引起stack over flow

3 方法区(permanent heap)内存泄漏:分析其原因的文章较少,本文的着重点。

作者:: 老哇的爪子 Attilax 艾龙,  EMAIL:1466519819@qq.com

转载请注明来源: http://blog.csdn.net/attilax

2. PermGen内存溢出深入分析

在本部分,首先交代一下必要的前提知识,这也为理解后面的測试程序做铺垫。

前提知识

4 由不同的类载入器实例载入的类型能够等价为全然不同的类型,哪怕时同一类型类载入器的不同实例载入的,都会在PermGen区域分配对应的空间来存储类型信息

5 新类型载入时,会在PermGen区域申请对应的空间来存储类型信息,类型被卸载后,PermGen区域上的垃圾收集会释放对应的内存空 间。

PermGen区域和普通的堆空间一样。也遵循垃圾收集的规律。所以,网上非常多资料种关于PermGen区域空间的大小是仅仅增不减的说法是不对的, 后面会用对应的測试代码来验证和分析。

6 一种类型被卸载的前提条件是:载入此类型的类载入器实例变为不可达(unreachable)状态,

7 结合上面的[虚拟机执行时数据区的介绍|],能够得出结论:类型相应的普通实例、类型相应的java.lang.Class实例、载入此类型的ClassLoader实例。三者中有不论什么一种或者多种是reachable状态的,那么此类型就不可能被卸载。

8 JMX协议提供了对应的API接口。用来在执行时查询当前虚拟机实例的内存使用和类型载入等信息。这也是非常多Java性能监控和分析工具的基础,后面的測试程序中也有对应的代码使用了JMX协议。

3. PermGen OOM原因总结

通过以上測试程序分析,我们发现PermGen OOM发生的原因和类型装载、类型卸载有直接的关系,能够对PermGen OOM发生的原因做例如以下大致的总结:

10 为PermGen区域分配的堆空间过小,能够通过合理的设置-XX: PermSize參数和-XX:MaxPermSize參数来解决。

11 类型卸载不及时,过时无效的类型信息占用了空间。我们最好还是称其为"永久堆"的内存泄漏,须要通过深入分析类型卸载的原理来寻找相应的防范措施

4. 常见的类载入器和类型卸载的可能性总结

     通过前面的讨论,我们知道假设载入某种类型的类载入器实例没有处于unreachable状态,则该类型就不会被卸载。该类型不被卸载, 则相应的类型信息在PermGen区域中占有的堆内存就不会被释放。

以下,针对典型的Java应用分类,分析一下经常使用类载入器载入的类型被下载的可能性。

系统类载入器:负责载入程序类路径上面的类型,由其载入的类型在整个程序执行期间基本上不可能被卸载,相应类型信息占用的PermGen区域堆空间基本不可能得到释放。
用户自己定义类载入器:对于其载入的类型,满足类型卸载要求的可能性比較easy控制。仅仅要是事实上例本身处于unreachable状态,其载入的类型会被卸载,PermGen区域中相应的空间占有也会被释放。

5. PermGen内存溢出的应对措施

     通过上面的PermGen OOM的原因的分析,不难看出相应的应对措施:

12 合理的设置-XX: PermSize和-XX:MaxPermSize參数(基本的有效措施)

13 有效的利用的虚拟机类型卸载的机制(针对程序进行调优)

6. 另外一种就是使用oracleBEA JDK。由于这个里面的JVM没有PermGen space

这种区域。所以也就不存在这样溢出的问题。可是由于jrockit比較消耗

资源。所以我仅仅推荐在生产环境中使用,开发环境还是sun的比較省。

从这个角度来说sun jvm这个不能动态添加PermGen space大小

7. 參考

Java内存溢出之PermGen OOM深入分析 - zhu xing - 博客园.htm

Java 8 新特性探究(九)跟 OOMPermgen 说再见吧 推酷.htm

我要啦免费统计
原文地址:https://www.cnblogs.com/slgkaifa/p/7044972.html