zoukankan      html  css  js  c++  java
  • 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

    我要啦免费统计
  • 相关阅读:
    Java实现 蓝桥杯 算法提高 小X的购物计划
    Java实现 蓝桥杯 算法提高 小X的购物计划
    Java实现 第十一届 蓝桥杯 (高职专科组)省内模拟赛
    Java实现 第十一届 蓝桥杯 (高职专科组)省内模拟赛
    Java实现 第十一届 蓝桥杯 (高职专科组)省内模拟赛
    Java 第十一届 蓝桥杯 省模拟赛 小明的城堡
    Java 第十一届 蓝桥杯 省模拟赛 小明的城堡
    Java 第十一届 蓝桥杯 省模拟赛 小明的城堡
    129. Sum Root to Leaf Numbers
    117. Populating Next Right Pointers in Each Node II
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7044972.html
Copyright © 2011-2022 走看看