内存溢出之PermGen OOM深入分析
现在,网上关于讨论PermGen OOM的资料很多,但是深入分析PermGen区域内存溢出原因的资料很少。本篇文章尝试全面分析一下PermGen OOM的原因,其中涉及到了Java虚拟机运行时数据区、类型装载、类型卸载等,测试代码涉及到了JMX协议。相关前提知识如下: 1、Java类加载的基本原理 2、Java类型卸载相关的知识, http://www.blogjava.net/zhuxing/archive/2008/07/24/217285.html 3、简要了解JMX协议,有关JMX协议可以参加sun公司发布的技术规范,对JMX协议做一定的了解对理解Java性能监控和调优功能的实现原理有很大帮助。 【虚拟机运行时数据区介绍】 本部分将对Java虚拟机运行时数据区做一个简单的介绍,着重说明PermGen区域(永久存储区)存放的内容,并对运行时数据区的访问方式做一个归纳说明,为后面深入分析类型卸载和PermGen OOM做铺垫。为了更具有通用性,本部分将更多关注虚拟机协议本身,可能和具体的虚拟机实现有少许的出入。 【运行时数据区分类】 Java虚拟机的运行时数据区一般分类如下(不一定是物理划分): 堆:主要存放对象实例,线程共享 栈:主要存储特定线程的方法调用状态,线程独占 本地方法栈:存储本地方法的调用状态,线程独占 PC寄存器:学过操作系统课程的都知道,线程独占 方法区