java.lang.OutOfMemoryError: Metaspace异常解决的方法

网友投稿 710 2022-10-31


java.lang.OutOfMemoryError: Metaspace异常解决的方法

介绍 Metaspace

java8 及以后的版本使用Metaspace来代替永久代,Metaspace是方法区在HotSpot中的实现,它与持久代最大区别在于,Metaspace并不在虚拟机内存中而是使用本地内存也就是在JDK8中,classe metadata(the virtual machines internal presentation of Java class),被存储在叫做Metaspace的native memory.

永久代(java 8 后被元空间Metaspace取代了)存放了以下信息:

虚拟机加载的类信息

常量池

静态变量

即时编译后的代码

出现问题原因

错误的主要原因, 是加载到内存中的 class 数量太多或者体积太大。

解决办法

增加 Metaspace 的大小

-XX:MaxMetaspaceSize=512m

代码演示

模拟Metaspace空间溢出,我们不断生成类往元空间灌,类占据的空间是会超过Metaspace指定的空间大小的

查看元空间大小

java -XX:+PrintFlagsInitial

设置配置 这里设置10m方便演示效果

-XX:MetaspaceSize=10m -XX:MaxMetaspaceSize=10m

编写代码

import org.springframework.cglib.proxy.Enhancer;

import org.springframework.cglib.proxy.MethodInterceptor;

import org.springframework.cglib.proxy.MethodProxy;

import javafFKnliinhT.lang.reflect.Method;

public class MetaspaceDemo {

static class OOM{}

public static void main(String[] args) {

int i = 0;//模拟计数多少次以后发生异常

try {

while (true){

i++;

Enhancer enhancer = new Enhancer();

enhancer.setSuperclass(OOM.class);

enhancer.setUseCache(false);

enhancer.setCallback(new MethodInterceptor() {

@Override

public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {

return methodProxy.invokeSuper(o,args);

}

});

enhancer.create();

}

} catch (Throwable e) {

System.out.println("=================多少次后发生异常:"+i);

e.printStackTrace();

}

}

}

运行结果:


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:CYQ.Data 对于分布式缓存Redis、MemCache高可用的改进及性能测试
下一篇:CYQ.Data 支持分布式数据库(主从备)高可用及负载调试
相关文章

 发表评论

暂时没有评论,来抢沙发吧~