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.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
时间: 2017-11-04
Tags: java, jvm, class, SUN, jni

java.lang.OutOfMemoryError: PermGen space: java reflection的相关文章

java.lang.OutOfMemoryError: PermGen space及其解决方法

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存益出,解决方法也一定是加大内存.说说为什么会内存益出:这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理

公司的系統點擊一個功能的時候報java.lang.OutOfMemoryError: PermGen space

问题描述 在公司的系統中點擊了一個打印的功能,前臺是用flex,后臺是java,打印的時候是彈出來一個jsp頁面,中間夾了大量的計算.在本地測試沒事 可以彈出來jsp頁面,但是放在測試機上時候就會報如下異常,我在測試服務器的環境變量里設置了 变名:JAVA_OPTS 变量值:-Xms1024m -Xmx1024m 還是沒有作用,不知道應該怎么處理了.是程序的問題嗎?java.lang.OutOfMemoryError: PermGen spaceat java.lang.ClassLoader.

Tomcat – java.lang.OutOfMemoryError: PermGen space Cause and Solution

Read more: http://javarevisited.blogspot.com/2012/01/tomcat-javalangoutofmemoryerror-permgen.html#ixzz3QDWa3Zqi Tomcat web server often suffers from java.lang.OutOfMemoryError: PermGen space whenever you deploy and undeploy your web application coupl

tomcat-java.lang.OutOfMemoryError: PermGen space

问题描述 java.lang.OutOfMemoryError: PermGen space 项目是用:Spring+Struts2+Mybatis开发的, 服务器:Tomcat7.x IDE:MyEclipse10 在项目启动时报内存溢出异常(java.lang.OutOfMemoryError: PermGen space) 解决方案 感谢各位大神的热心帮助.问题解决了,解决过程如下:Window --> Preferences --> MyEclipse --> Servers -

Java.Lang.OutOfMemoryError 错误——设置java Heap Size

1.确定当前系统可以设置的最大值: Below command will help you to identify the maximum memory heap size than can be allocated to a JVM process. java -mx[value]m -version Start with a higher value like 4G or higher and slowly cut down to the maximum allowed value. 举例:

Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结(转)

java.lang.OutOfMemoryError这个错误我相信大部分开发人员都有遇到过,产生该错误的原因大都出于以下原因:JVM内存过小.程序不严密,产生了过多的垃圾. 导致OutOfMemoryError异常的常见原因有以下几种: 内存中加载的数据量过于庞大,如一次从数据库取出过多数据: 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收: 代码中存在死循环或循环产生过多重复的对象实体: 使用的第三方软件中的BUG: 启动参数内存值设定的过小: 此错误常见的错误提示: tomcat

java.lang.OutOfMemoryError 错误整理及解决办法_java

java.lang.OutOfMemoryError处理错误 java.lang.OutOfMemoryError异常解决方法 原因: 常见的有以下几种: 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据: 2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收: 3.代码中存在死循环或循环产生过多重复的对象实体: 4.使用的第三方软件中的BUG: 5.启动参数内存值设定的过小: 常见错误提示: 1.tomcat:java.lang.OutOfMemoryError: Perm

tomcat-启动项目时!一直报错 OutOfMemoryError: PermGen space

问题描述 启动项目时!一直报错 OutOfMemoryError: PermGen space java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect

Eclipse+Jboss报java.lang.OutOfMemoryError:PermGen space异常的解决办法

Eclipse+Jboss报java.lang.OutOfMemoryError:PermGen space异常的解决办法 在Eclipse的工具栏中找到"小虫子"的调试图标或向右的白色箭头的图片,点击它们其中一个的右侧的向下的黑色箭头,找到 Configurations 选项,然后在右边的选项卡中选择 Arguments 选项卡,在下面的VM arguments 输入框中输入如下一段,其中"D:/develop/jboss-4.0.4.GA"是我的电脑的JOSS的