美文网首页
关于 MetaSpace 及 FastJSON 导致的 OOM

关于 MetaSpace 及 FastJSON 导致的 OOM

作者: 小陈阿飞 | 来源:发表于2019-03-05 09:48 被阅读14次

关于 MetaSpace 内存

在 JDK8 之前,虚拟机内存主要分为堆和非堆两部分,堆中划分新生代老生代,非堆中包含所有非对象信息和运行时信息,其中有一块叫 PermGen,用以保存字节码等类信息。在 JDK8 中取消了这块内存,并添加了 MetaSpace 替代所有功能。

这两块的区别

最大的区别就是位置不同大小不同,PermGen 仍然归属 JVM 内存,一般 32M 或者 64M,都很小,MetaSpace 直接位于本地内存,默认大小只受物理机限制,直到用完物理机内存才抛出 OOM。

所以在某些情况下直接升级 JDK8 可能就出现内存持续增长的情况,在这种情况下通过 top 命令会发现内存猛涨,远超 Xmx 设置的大小, 但通过 jmap 则发现正常。

例如

先看段 fastjson 的代码:

public void process(HttpServletResponse resp) {
    ....
    SerializeConfig config = new SerializeConfig();
    config.put(Long.class, RsLongSerializer.instance);
    resp.getWriter().print(JSON.toJSONString(obj,config));
}

这段代码的问题就在 SerializeConfig 默认会激活 asm,在序列化对象时会为对象生成代理类,然后通过执行代理进行序列化操作,通过这样优化来提高执行性能,但在应用不合理每次新创建 config 的时候就会导致大量生成代码类反而拖慢性能。反序列化时的 ParserConfig 也是同理。

在 jdk8 之前这些代理类会充满 Perm 区导致 FullGC,浪费点 CPU 也不会有大问题,但在 JDK8 中,这些类会大量创建直至充满物理机内存,进而导致进程被系统杀掉。

附 MetaSpace 相关参数

  • -XX:MetaspaceSize,初始空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。
  • -XX:MaxMetaspaceSize,最大空间,默认是没有限制的。
  • -XX:MinMetaspaceFreeRatio,在GC之后,最小的Metaspace剩余空间容量的百分比,减少为分配空间所导致的垃圾收集
  • -XX:MaxMetaspaceFreeRatio,在GC之后,最大的Metaspace剩余空间容量的百分比,减少为释放空间所导致的垃圾收集

相关文章

  • 关于 MetaSpace 及 FastJSON 导致的 OOM

    关于 MetaSpace 内存 在 JDK8 之前,虚拟机内存主要分为堆和非堆两部分,堆中划分新生代老生代,非堆中...

  • OOM之Metaspace

    JVM参数-XX:MetaspaceSize=8m -XX:MaxMetaspaceSize=8mJava 8及之...

  • 自己项目中用到的obj 转hashMap

    需求背景:项目中原来是通过fastJson 进行转换的,但是这个方法在vivo51上会卡死手机,最后导致OOM。 ...

  • 高并发导致的fastjson OOM问题排查

    问题 一次线上发版过程中发现应用的接口出现大量的超时现象.通过告警和链路追踪系统发现是有一个应用的dubbo请求大...

  • Metaspace OOM问题处理

    一、背景 系统会偶现下面Metaspace区OOM的情况,服务器在重启后就会立马恢复,而且后面基本不会再复现,可能...

  • 实验: metaspace区域OOM

    Cglib 动态代理,会动态创建类 如果使用不当会导致生成大量的类元数据 塞满metaspace 试验代码 依赖...

  • 可能出现OOM的区域和情况分析

    1. MetaSpace 加载太多类 metaspace 塞不下的时候会导致 full gc,连带回收老年代空间 ...

  • Java Metaspace OOM问题分析

    问题描述: 系统上线发生FullGC 定位过程: 1、查看zabbix监控找到FullGC时间点;2、根据时间点搜...

  • 生产问题-MetaSpace空间OOM

    发现故障、 生产服务器某天开始,突然每天不同时间点报MetaSpace的oom,因为本身服务器没有监控,加上是集群...

  • Netty模拟OOM-Metaspace

    在模拟OOM之前, 先简单说下Netty服务端向客户端发送数据的时候, 涉及两个存储数据的地方, 如下图所示 业务...

网友评论

      本文标题:关于 MetaSpace 及 FastJSON 导致的 OOM

      本文链接:https://www.haomeiwen.com/subject/fizguqtx.html