博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
代码实现java8元空间溢出
阅读量:4210 次
发布时间:2019-05-26

本文共 1379 字,大约阅读时间需要 4 分钟。

最近组内项目报了一个错,大概原因就是元空间的问题。虽然问题解决了,但是对于作者来说感觉还是一头雾水,为啥一头雾水?因为我们知道元空间在java8中替代的是java7中的永久代,永久代就是存储类信息,我们用到的类都要存放到这块空间。但是在java8中元空间在堆外。那么元空间的出错就成了容量太小装不下项目运行所需要的类?那么又是何种原因导致项目会不断生成新的类?我们知道java的动态代理会生成代理类,代理类的特点就是类名后边很多莫名其妙的字符。所以我们的元空间导致的问题很大原因上还是使用了动态代理。而且这些动态代理类被无限的生成了并且没有来得及被卸载,或者被卸载了但是其生成的对象还在。

那么咋实现一下如何让元空间溢出吧。

编写一段代码:

@RestController@RequestMapping("/v")public class UserController {    Logger logger= LoggerFactory.getLogger(UserController.class);    @Autowired    private ThreadService threadService;    @GetMapping(value = "/test")    public String TEST(){        Enhancer enhancer = new Enhancer();        enhancer.setSuperclass(User.class);        enhancer.setUseCache(false);        enhancer.setCallback(new MethodInterceptor() {            @Override            public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {                return proxy.invoke(obj, args);            }        });        Object o=enhancer.create();        System.out.println(o.toString());        User user=threadService.getUser();        logger.info(user.toString());        user.setUserName("1");        return "success";    }}

设置元空间大小100M

使用jmeter发送接口,设置100个线程,每秒100次请求,轮询10000次。

使用java visualVm进行载入类数量和元空间变化情况。

查看报错日志:

切断jmeter连接中断报错。

小结:通过上述代码,我们可以得出的结论就是我们编写对访问量有要求的系统的时候要主要避免采用动态代理。至于我们组项目线上的报错本人还没研究透彻,虽然解决了问题。但是也匪夷所思,就到这里吧,等研究透了再写文章,OK晚安。

转载地址:http://yzumi.baihongyu.com/

你可能感兴趣的文章
YApi在Window上离线安装笔记
查看>>
Mysql学习笔记(十三)查看mysql日志
查看>>
JVM垃圾回收相关知识笔记
查看>>
Curator学习笔记(一)- 读写锁
查看>>
第一次炒股小记
查看>>
《redis in action》ZSet相关命令
查看>>
《redis in action》redis发布订阅
查看>>
《redis in action》sort排序命令
查看>>
《redis in action》redis事务
查看>>
《redis in action》key的自动过期
查看>>
《redis in action》redis持久化简介
查看>>
Oracle RAC Failover 详解
查看>>
批处理 自动修改 IP 地址
查看>>
Oracle RAC LoadBalance
查看>>
v$sql,v$sqlarea,v$sqltext 和 v$sql_plan 说明
查看>>
ORA-31623 When Submitting a Datapump Job [ID 308388.1]
查看>>
Oracle SYSAUX 表空间 说明
查看>>
RAC 安装patch 后启动实例 报错 ORA-00439 feature not enabled- Real Application Clusters 解决方法
查看>>
On RAC, expdp Removes the Service Name [ID 1269319.1]
查看>>
Important Changes to Oracle Database Patch Sets Starting With 11.2.0.2 [ID 1189783.1]
查看>>