java.lang.OutOfMemoryError: PermGen space: java reflection

简介: 原文地址:https://stackoverflow.com/questions/16130292/java-lang-outofmemoryerror-permgen-space-java-reflection/47090043#47090043问题使用如下java反射代码:Method method = LogFactory.

原文地址:https://stackoverflow.com/questions/16130292/java-lang-outofmemoryerror-permgen-space-java-reflection/47090043#47090043

问题

使用如下java反射代码:

Method method = LogFactory.class.getDeclaredMethod("getContextClassLoader");
method.setAccessible(true);
ClassLoader classLoader = (ClassLoader)method.invoke(null);
LogFactory.release(classLoader);

使用jprofiler看到很多类似sun.reflect.GeneratedMethodAccessor11这种类,在每次调用的时候都增长:

sun.reflect.BootstrapConstructorAccessorImpl
sun.reflect.NativeConstructorAccessorImpl
sun.reflect.DelegatingConstructorAccessorImpl
sun.reflect.DelegatingClassLoader

我觉得这个是PermGen space 增长的原因,但是如何清理掉这些类呢?

网友[路人甲]的一段解释

当使用java反射,有两种方法获取被反射的类的信息。可以使用JNI的方式,也可以使用字节码的方式。如果使用字节码的方式,需要java的类和类加载器(sun/reflect/GeneratedMethodAccessor class and sun/reflect/DelegatingClassLoader)。这些类和类加载器使用本地内存。使用字节码的方式也使用JIT编译,但是这会更加重本地内存的使用。如果频繁使用java反射,这更能带来一个显著的内存使用上的上升。JVM会优先使用JNI的方式,在经历过一些相同的类之后,才会使用字节码的方式。这被称为膨胀效应-当JVM从JNI方式变为字节码的方式。幸运的是,我们可以通过一个Java属性配置,sun.reflect.inflationThreshold属性告诉JVM使用JNI方式多少次,如果设置为0,JNI方式将会被一直使用。既然字节码的方式比JNI的方式使用更多内存,如果我们使用Java反射,我们系王世勇JNI的方式。为了实现这个,我们只需要设置inflationThreshold属性为0即可。

网友[路人乙]的补充

如果使用oracle 的JVM,这样子设置:

sun.reflect.inflationThreshold=2147483647 

如果使用IBM JVM,这样设置:

-Dsun.reflect.inflationThreshold=0
目录
相关文章
|
2月前
|
Java Linux
8 种 Java- 内存溢出六 -Out of swap space?
8 种 Java- 内存溢出六 -Out of swap space?
|
1月前
|
Java
什么是Java中的反射(Reflection),如何使用它
什么是Java中的反射(Reflection),如何使用它
|
2月前
|
存储 Java 关系型数据库
8 种 Java- 内存溢出之三 -Permgen space
8 种 Java- 内存溢出之三 -Permgen space
|
3月前
|
存储 Java API
Java中的Reflection(反射)、暴力反射
Java中的Reflection(反射)、暴力反射
|
8月前
|
Java
Java Reflection机制 实现类的反射与动态调用
Java Reflection机制被广泛用于实现类的反射和动态调用,反射是指在运行时检查和操作类的能力。只需要一个类的名称或对象的引用,就可以获取类的信息,调用类的方法,创建对象实例等。
32 0
|
4月前
|
Java API
Java语言特性: 解释一下Java中的反射(Reflection)。
Java语言特性: 解释一下Java中的反射(Reflection)。
24 0
|
5月前
|
Java 数据库连接 Spring
Java的反射(reflection)机制的简单使用
Java的反射(reflection)机制的简单使用
49 0
|
5月前
|
前端开发 Java API
Java反射机制(Reflection)简解与示例
Java反射机制(Reflection)简解与示例
57 0
|
7月前
|
Java 关系型数据库 MySQL
C#反射(Reflection)详解及于java反射的对比
C#反射(Reflection)详解及于java反射的对比
|
9月前
|
Java 应用服务中间件
如果 JAVA 程序中抛出了 java.lang.OutOfMemoryError:Java heap space ,请讲一下解决问题的思路。
如果 JAVA 程序中抛出了 java.lang.OutOfMemoryError:Java heap space ,请讲一下解决问题的思路。
63 0