Java方法区溢出 冷不防 2022-03-01 03:26 211阅读 0赞 ## Java方法区溢出 ## 方法区用于存放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() { @Override public 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虚拟机内存管理:栈区、堆区、方法区理解 在Java虚拟机(JVM)的内存管理中,主要包括三个区域:栈区、堆区和方法区。下面分别介绍这三个区域: 1. 栈区(Stack): - **局部变量**:每个方法都有自 绝地灬酷狼/ 2024年09月10日 16:42/ 0 赞/ 20 阅读
相关 java方法区的回收 方法区(Hotspot虚拟机中的永久代)的垃圾回收主要收集两部分的内容:废弃常量和无用的类。 废弃常量的回收 以常量池中字面量的回收为例,假如一个字符串“abc”已经进 Dear 丶/ 2022年11月30日 04:25/ 0 赞/ 176 阅读
相关 46栈内存溢出、内存区域(程序计数器、Java 虚拟机栈、本地方法栈、Java 堆、方法区、直接内存、内存溢出)与内存溢出(对象实例化分析) 46.什么情况下会发生栈内存溢出 46.1.Java 内存区域与内存溢出 46.1.1.内存区域 46.1.1.1.程序计数器 46.1.1.2.Java 虚拟 太过爱你忘了你带给我的痛/ 2022年09月04日 14:57/ 0 赞/ 136 阅读
相关 方法区溢出 方法去用于存放Class的相关信息,如:类名,访问修饰符,常量池,字符描述,方法描述等。对于这个区域的测试,基本思路是运行时产生大量的类去填满方法区,知道溢出。虽然直接使用Ja 客官°小女子只卖身不卖艺/ 2022年08月26日 11:29/ 0 赞/ 118 阅读
相关 方法区 方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码数据。当方法区无法满足内存分 素颜马尾好姑娘i/ 2022年08月19日 14:26/ 0 赞/ 145 阅读
相关 【PWN】简单缓存区溢出 【解法】 拿到文件,查看伪代码,发现v4变量的地址是 -50h (也就是-80) ![70][] 那么要想覆盖到key变量的地址,我们就得用ida分析获取输入的地址和k 我就是我/ 2022年05月15日 02:38/ 0 赞/ 128 阅读
相关 常量区、方法区、堆 通常我们定义一个基本数据类型的变量,函数调用的现场保存,一个对象的引用,都使用JVM中的栈空间; 通过new关键字和构造器创建的对象放在堆空间,堆是垃圾收集器管理的主要区域, - 日理万妓/ 2022年05月08日 07:12/ 0 赞/ 233 阅读
相关 Java方法区溢出 Java方法区溢出 方法区用于存放Class的相关信息,如:类名,访问修饰符,常量池,字符描述,方法描述等。对于这个区域的测试,基本思路是运行时产生大量的类去填满方法区, 冷不防/ 2022年03月01日 03:26/ 0 赞/ 212 阅读
相关 jvm 内存溢出 - 方法区及运行时常量池溢出 jvm 内存溢出 - 方法区及运行时常量池溢出 Java 永久代是非堆内存的组成部分,用来存放类名、访问修饰符、常量池、字段描述、方法描述等,因运行时常量池是方法区的一部 ╰半橙微兮°/ 2022年03月01日 02:38/ 0 赞/ 231 阅读
还没有评论,来说两句吧...