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

1. 内存区域的划分 1

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

3. PermGen OOM原因总结 2

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

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

6. 第二种就是使用oracle的BEA 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协议。

9

3. PermGen OOM原因总结

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

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

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

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

通过前面的讨论,我们知道如果加载某种类型的类加载器实例没有处于unreachable状态,则该类型就不会被卸载,该类型不被卸载, 则对应的类型信息在PermGen区域中占有的堆内存就不会被释放。下面,针对典型的Java应用分类,分析一下常用类加载器加载的类型被下载的可能性。

系统类加载器:负责加载程序类路径上面的类型,由其加载的类型在整个程序运行期间基本上不可能被卸载,对应类型信息占用的PermGen区域堆空间基本不可能得到释放。

用户自定义类加载器:对于其加载的类型,满足类型卸载要求的可能性比较容易控制,只要是其实例本身处于unreachable状态,其加载的类型会被卸载,PermGen区域中对应的空间占有也会被释放。

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

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

12 合理的设置-XX: PermSize和-XX:MaxPermSize参数(主要的有效措施)

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

6. 第二种就是使用oracle的BEA JDK,因为这个里面的JVM没有PermGen space

这样的区域,所以也就不存在这样溢出的问题。但是因为jrockit比较消耗

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

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

7. 参考

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

Java 8 新特性探究(九)跟 OOM:Permgen 说再见吧 - 推酷.htm

Atitit.提升稳定性-----分析内存泄漏PermGen OOM跟解决之道...java的更多相关文章

  1. 使用Memory Analyzer tool(MAT)分析内存泄漏(二)

    转载自:http://www.blogjava.net/rosen/archive/2010/06/13/323522.html 前言的前言 写blog就是好,在大前提下可以想说什么写什么,不像投稿那 ...

  2. 使用Memory Analyzer tool(MAT)分析内存泄漏

    前言的前言 写blog就是好,在大前提下可以想说什么写什么,不像投稿那么字字斟酌.上周末回了趟成都办事,所以本文来迟了.K117从达州经由达成线往成都方向走的时候,发现铁路边有条河,尽管我现在也不知道 ...

  3. 性能监控 | MAT分析内存泄漏

    使用MAT分析内存泄漏(二)八周年重印版 - 知乎 .u-safeAreaInset-top { height: constant(safe-area-inset-top) !important; h ...

  4. 【转】如何使用MAT分析内存泄漏

    原文链接:http://www.lightskystreet.com/2015/09/01/mat_usage/ MAT - Memory Analyzer Tool 使用进阶 Sep 1, 2015 ...

  5. atitit.提升稳定性---hibernate 增加重试retry 机制解决数据库连接关闭

    atitit.提升稳定性---hibernate 增加重试retry 机制解决数据库连接关闭 1. 流程总结 retry(5times).invoke(xxx).test().rest().$() t ...

  6. atitit.提升稳定性---hibernate 添加重试retry 机制解决数据库连接关闭

    atitit.提升稳定性---hibernate 添加重试retry 机制解决数据库连接关闭 1. 流程总结 retry(5times).invoke(xxx).test().rest().$() t ...

  7. 使用androidstudio 分析内存泄漏

    分析内存泄漏 http://www.jianshu.com/p/c49f778e7acf

  8. 如何使用memstat 插件分析内存泄漏问题

    对于内存泄漏问题,如何分析并找到内存泄漏的原因是个难点.KingbaseES 提供了memstat 扩展插件用于分析内存泄漏的原因. 一.使用 memstat 插件 1.修改shared_preloa ...

  9. Android studio 分析内存泄漏

    以前用eclipse的时候,我们采用的是DDMS和MAT,不仅使用步骤复杂繁琐,而且要手动排查内存泄漏的位置,操作起来比较麻烦.后来随着Android studio的潮流,我也抛弃了eclipse加入 ...

随机推荐

  1. 解决:HttpClient导致应用出现过多Close_Wait的问题

    最近发现一个问题,在服务器上通过netstat命令发现有大量的Close_Wait长时间存在,甚至有时候数量接近1000: 查看服务器参数(etc/sysctl.conf): net.ipv4.tcp ...

  2. 第三十八章 springboot+docker(maven)

    回顾上一章的整个部署过程: 使用"mvn install"进行打包jar 将jar移动到与Dockerfile文件相同的文件夹下 编写Dockerfile文件 使用"do ...

  3. flash builder关掉自动编译功能

    菜单栏 项目,里面有个自动构建,把√去掉就ok了

  4. Java语言环境(JDK的安装教学)

    //此文档由徐浩军编写(32/64位系统都适用) 1.下载JDK安装包你 2.点击安装包开始安装 3.首先你要选择安装地址一般情况下,都会选择默认地址. (请记住这个地址,之后配置环境变量的时候需要用 ...

  5. shell脚本学习(一)

    Shell脚本最常用于系统管理工作,或者用于结合现有的程序以完成小型.特定的工作. Shell的特点有: 1. 简单性 2. 可移植性 3. 开发容易 [什么是shell] 简单点理解,就是系统跟计算 ...

  6. std::reverse_iterator::base

    google chromium base MRU_Cache 支持反向erase iterator Erase(iterator pos) {  deletor_(pos->second);  ...

  7. 用nodej和glub-watcher写的监听go 项目自动编译,很鸡肋

    glub 一般都是很轻量的编译. go太重了,改一小个部分,就编译的话,多数是编译失败. 而且很消耗性能,还没想到完美的优化办法. 暂时用个定时器 监听2秒,停止1秒,如此循环,会减少些 “无效”的编 ...

  8. CSS颜色名称和颜色值

    aliceblue:艾利斯兰 #F0F8FF antiquewhite:古董白 #FAEBD7 aqua:浅绿色 #00FFFF aquamarine:碧绿色 #7FFFD4 azure:天蓝色 #F ...

  9. Eclipse+Mingw+Boost 环境搭建

    一.安装CDT插件 Eclipse是用Java的swt开发的,所以需要java虚拟机才能运行,jdk的配置方法网上一大堆,这里就不细说了.安装CDT的方法简单提一下,到Help->Eclipse ...

  10. each函数