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)分析内存泄漏(二)

    前言 在 使用Memory Analyzer tool(MAT)分析内存泄漏(一)中,我介绍了内存泄漏的前因后果.在本文中,将介绍MAT如何根据heap dump分析泄漏根源.由于测试范例可能过于简单 ...

  2. 手把手教你在Android-Studio上分析内存泄漏,面试必会

    导语 本文的目的很简单,一句话:用最少的时间,最高效率,让你清楚:想要做Android开发,你需要学什么?你该在哪学? 本文的特点在于将繁琐的知识化为系列专题的形式展现给读者,当你能跟随博主构建的体系 ...

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

    使用Memory Analyzer tool(MAT)分析内存泄漏(一) (2010年05月21日) 发表于 Java博客 前言的前言 :本文是自 2005 年 8 月以来,首次在一个月之内发布三篇文 ...

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

    http://www.blogjava.net/rosen/archive/2010/05/21/321575.html http://www.blogjava.net/rosen/archive/2 ...

  5. Profiler分析内存抖动,Memory Analyzer(mat)分析内存泄漏(不懂砍我)

    前言: 最近在系统性的温习了一遍android性能优化.写博客是学习也是记录,希望在记录的同时也能帮助其他同学.最近我觉得我想出一个不懂系列."不懂揍我","不懂砍我&q ...

  6. Memory Analyzer分析内存泄漏

    Memory Analyzer分析内存泄漏 模拟一次内存溢出 程序不断地向ArrayList添加对象,直至溢出 public class User {String userName;String pa ...

  7. dump heap及分析内存泄漏

    背景 在Android开发中,因为多了生命周期概念和相关类,很容易出现内存泄漏的问题,并且找到和复现这些问题很麻烦.不过内存泄漏是很容易被代码检测或者现成的工具检测出来的.基于这个场景,需要学会dum ...

  8. Android之 内存泄漏问题检测和解决

    一,背景: 1.1,什么是内存泄漏 内存泄漏指程序在申请内存后,无法释放已申请的内存空间,导致系统无法及时回收内存并且分配给其他进程使用. 1.2,内存管理 1.3,垃圾回收 上面可以看出GC回收的主 ...

  9. [转] 利用jemalloc分析内存泄漏

    from: https://blog.intzero.net/tools/jemalloc.html Jemalloc 不仅实现了一种通用的malloc, 还能利用它来做内存分析和监控/调优等. 这里 ...

  10. Android Studio +MAT 分析内存泄漏实战

    点击打开链接 对于内存泄漏,在Android中如果不注意的话,还是很容易出现的,尤其是在Activity中,比较容易出现,下面我就说下自己是如何查找内存泄露的. 首先什么是内存泄漏? 内存泄漏就是一些 ...

最新文章

  1. arcgis 中label feature太长换行_MapGIS转换为ArcGIS小结
  2. 谈中型项目下的编码技巧二
  3. 不得自行对涉密计算机进行格式化,保密资格认证-涉密人员考试试题
  4. linux下fdisk分区工具的使用
  5. 国防科大提出基于可变形三维卷积的视频超分辨,代码已开源
  6. 苏宁大数据怎么运营_运营商大数据精准获客
  7. 起点低,是彪悍的最好证明!
  8. MTK 驱动---(11) EMI定制
  9. ERC20合约标准详解分析
  10. 在哪里搜python题_robots文件生成
  11. ajax执行成功后,在success回调函数中把后台返回的list还原到html的table中
  12. java 分布式任务_Java中实现分布式定时任务
  13. 认识RAW修图基础知识
  14. mc小刘yeah粉丝网
  15. 操作手册与用户手册的区别
  16. router跳转外部链接
  17. 苹果、微软、谷歌三巨头联手,“杀死”密码
  18. 解决JETBRAINS官网打不开
  19. 《猫和老鼠》里的魔术艺术(四)——夸张与对比
  20. java 索引数组_Java的数组索引问题

热门文章

  1. SetNamedPipeHandleState
  2. 【iOS-iap防护】验证用户付费收据!拒绝iap Cracker!!
  3. Python网络编程之基于socket实现文件上传
  4. 解决 Composer 运行时的 Xdebug 冲突
  5. javascript窗口属性示意图
  6. VC Studio集成开发环境下编译Apache--jin点滴实验手记
  7. MySQL-第九篇分组和组函数
  8. Java中static的用法,初始化块
  9. 7-16 Sort with Swap(0, i)(25 分)
  10. BDFZOI 数论小结1(筛法、欧拉phi函数)