方法区溢出
来源:互联网 发布:flowchart.js演示 编辑:程序博客网 时间:2024/05/17 07:31
方法去用于存放Class的相关信息,如:类名,访问修饰符,常量池,字符描述,方法描述等。对于这个区域的测试,基本思路是运行时产生大量的类去填满方法区,知道溢出。虽然直接使用Java SE API也可以动态产生类(如反射时的GeneratedConstructorAccessor和动态代理等),但在本次试验使用CGLIB直接操作字节码运行时,生成大量的动态类。
值得注意的是,当前主流的很多框架 如:Spring,Hibernate对类进行增强时,都会使用到类似CGLIB这类字节码技术,增强的类越多,就需要越大的方法区来保证动态生成的Class可以加载如内存。例如:
import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;/** * 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(OOM.class);enhancer.setUseCache(false);enhancer.setCallback(new MethodInterceptor() {@Overridepublic Object intercept(Object obj, Method arg1, Object[] args, MethodProxy proxy) throws Throwable {return proxy.invokeSuper(obj, args);}});OOM oom = (OOM) enhancer.create();oom.sayHello("Kevin LUAN");}}static class OOM {public String sayHello(String str) {return "HI " + str;}}}
Caused by: java.lang.OutOfMemoryError:PermGen space
JDK 1.7 64位运行结果如下:
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)
Exception in thread "main"
Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "main"
方法区溢出也是一种常见的内存溢出异常,一个类如果要被垃圾回收器回收掉,判定条件非常苛刻,在经常动态生成大量Class的应用中,需要特别注意类的回收状况。这类场景除了上面提到的程序使用GCLIB字节码增强外,常见的还用JSP或动态产生JSP文件的应用(JSP第一次运行时需要编译为JAVA类),基于OSGI的应用(即使是同一个类文件,被不同的加载器加载也会视为不同的类)等。
#增加JVM 参数 来快速定位下 Class load ,来定位下。
-XX:+TraceClassLoading -XX:+TraceClassUnloading
输出格式:[Loaded sun.rmi.server.LoaderHandler from /usr/local/java/jdk1.7.0/jre/lib/rt.jar]可以方便定位出增加的CLASS 文件来源- 方法区溢出
- Java方法区溢出
- 方法区溢出+直接内存溢出
- jvm_方法区溢出(PermGen Space)
- VS_检测溢出方法
- 内存溢出优化方法
- cglib动态生成class文件以及方法区溢出
- 方法区和运行时常量池溢出
- tomcat5.5 reload 出现方法区溢出的问题
- Java虚拟机OOM之方法区溢出(6)
- cglib动态生成class文件以及方法区溢出
- 方法区和运行时常量池溢出
- 方法区和运行时常量池溢出
- 方法区和运行时常量池溢出
- 方法区和运行时常量池溢出
- 【JVM】4_利用GCLib测试方法区溢出
- 缓冲区溢出的保护方法
- 防止 Solaris 溢出的方法
- 通过 Tomcat Advanced I/O 获得高性能的 Ajax
- 在Android中如何使用SQLite
- 黑客文化简史
- LinkedList、ArrayList
- 【并查集判环】hdu 2120 Ice_cream's world I
- 方法区溢出
- java 四则运算 栈的实现
- 钱荒下银行理财收益率角逐:邮储银行垫底
- Android中版本兼容问题
- 从零开始学android<Button组件的使用.五.>
- 面试题集锦---BY算法导论小组
- Ruby中的注释
- 怎么写广告?-竞价广告的8条铁律
- 计算机网络面试题(一)