Java虚拟机OOM之方法区溢出(6)
来源:互联网 发布:人大代表 知乎 编辑:程序博客网 时间:2024/05/08 03:10
方法区用于存放 Class 的相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等。
对于这个区域的测试,基本的思路是运行时产生大量的类去填满方法区,直到溢出。虽然直接使用 JavaSE API 也可以动态产生类(如反射时的GeneratedConstructorAccessor 和动态代理等),但在本次实验中操作起来比较麻烦。在代码清单 2-5 中,笔者借助 CGLib①直接操作字节码运行时,生成了大量的动态类。
值得特别注意的是,我们在这个例子中模拟的场景并非纯粹是一个实验,这样的应用经常会出现在实际应用中:当前的很多主流框架,如 Spring 和 Hibernate 对类进行增强时,都会使用到 CGLib 这类字节码技术,增强的类越多,就需要越大的方法区来保证动态生成的 Class 可以加载入内存。
/** * VM Args: -XX:PermSize=10M -XX:MaxPermSize=10M */public class JavaMethodAreaOOM { public static void main(String[] args) { while (true) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(OOMObject.class); enhancer.setUseCache(false); enhancer.setCallback(new MethodInterceptor() { public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { return proxy.invokeSuper(obj, args); } }); enhancer.create(); } } static class OOMObject { }}
运行结果:
Caused by: java.lang.OutOfMemoryError: PermGen spaceat java.lang.ClassLoader.defineClass1(Native Method)at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)at java.lang.ClassLoader.defineClass(ClassLoader.java:616)... 8 more
方法区溢出也是一种常见的内存溢出异常,一个类如果要被垃圾收集器回收掉,判定条件是非常苛刻的。在经常动态生成大量 Class 的应用中,需要特别注意类的回收状况。这类场景除了上面提到的程序使用了 GCLib 字节码增强外,常见的还有:大量 JSP 或动态产生 JSP 文件的应用( JSP 第一次运行时需要编译为Java 类)、基于 OSGi 的应用(即使是同一个类文件,被不同的加载器加载也会视为不同的类)等。
3 0
- Java虚拟机OOM之方法区溢出(6)
- Java虚拟机OOM之虚拟机栈和本地方法栈溢出(4)
- 探索深入理解java虚拟机之java内存溢出(OOM)解析(3)
- Java虚拟机OOM之运行时常量池溢出(5)
- OOM java内存溢出
- Java内存溢出之PermGen OOM深入分析
- Java虚拟机(二)--OOM异常
- Java内存区域与内存溢出异常OOM——深入理解Java虚拟机
- Java的内存溢出(OOM)
- Java常见内存溢出OOM
- Android 内存溢出(OOM)问题分析方法
- Java方法区溢出
- OOM(内存溢出)解决方案
- OOM内存溢出(转)
- Java虚拟机内存溢出
- java 虚拟机内存溢出
- java虚拟机内存溢出
- java虚拟机栈溢出
- ie的开发者工具在页面包含iframe,且src不同域时,由打开开发工具而触发的js错误提示
- phonegap的开发
- Hadoop2.6.0伪分布式安装及测试笔记
- spring的ioc原理
- sqoop1.99.4搭建(hadoop2.4.0)
- Java虚拟机OOM之方法区溢出(6)
- java面试
- ANDROID基础学习笔记_4_生成xml文件
- Codeforces#167E Wizards and Bets 高斯消元
- 数据结构实验之栈一:进制转换
- 蚂蚁爬杆问题(Java面向对象)
- 打印1到最大的N位数
- 关于反编译apk问题
- 机器学习笔记c8主成分分析(日期格式转换,cast)