一次jdk 1.7 永久带oom信息定位

原创
2018/11/13 19:18
阅读数 648

2018-11-11 线上机器永久带发生了oom,永久带oom大部分有关的就是反射,和类加载器不断新增(我是带着这个思维去找问题)。

2018-11-13 根据线上dump的堆栈信息,定位到发生oom的线程栈

pool-554-thread-5" prio=5 tid=12621 RUNNABLE at java.lang.OutOfMemoryError.<init>(OutOfMemoryError.java:48) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:800) local variable: java.lang.String#6651822 local variable: byte[]#7709 local variable: java.lang.String#6651823 at com.alibaba.fastjson.util.ASMClassLoader.defineClassPublic(ASMClassLoader.java:42) at com.alibaba.fastjson.parser.deserializer.ASMDeserializerFactory.createStringFieldDeserializer(ASMDeserializerFactory.java:1251) at com.alibaba.fastjson.parser.deserializer.ASMDeserializerFactory.createFieldDeserializer(ASMDeserializerFactory.java:1159) at com.alibaba.fastjson.parser.ParserConfig.createFieldDeserializer(ParserConfig.java:557) local variable: com.alibaba.fastjson.util.FieldInfo#210868 at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.createFieldDeserializer(JavaBeanDeserializer.java:89) at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.addFieldDeserializer(JavaBeanDeserializer.java:82) local variable: java.lang.String#4185965 at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.<init>(JavaBeanDeserializer.java:47) local variable: com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer#23419 at com.alibaba.fastjson.parser.ParserConfig.createJavaBeanDeserializer(ParserConfig.java:508) at com.alibaba.fastjson.parser.ParserConfig.getDeserializer(ParserConfig.java:427) at com.alibaba.fastjson.parser.ParserConfig.getDeserializer(ParserConfig.java:354) at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:548) local variable: com.google.gson.internal.$Gson$Types$ParameterizedTypeImpl#23614 at com.alibaba.fastjson.JSON.parseObject(JSON.java:250) local variable: com.alibaba.fastjson.parser.DefaultJSONParser#7 at com.alibaba.fastjson.JSON.parseObject(JSON.java:226) at com.alibaba.fastjson.JSON.parseObject(JSON.java:196) 业务信息哪里使用的fastJson

 

2018-11-13 根据业务使用fastJson的方式,将版本和用法稍微模拟在本地环境。

版本:

    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.3</version>
    </dependency>

    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.1</version>
    </dependency>

 

用法:

Result resultObj = JSON.parseObject("{\"success\":false,\"errorType\":0,\"data\":{\"name\":\"nihao\",\"test\":\"nihao22\"}}", new TypeToken>(){}.getType()); `

2018-11-13 采用放大现象 多线程,几十万次反复调用(其实和线上场景差不多,线上是15个线程,200w次调用)

根据jdk下的jvisualvm,观察: 已装入类,和PermGen区

 

 

发现在疯狂的增长,说明永久带的oom 真有可能是这两个版本,和用法导致的。

使用IBM的分析工具观察Class List: 发现确实在不断的增加FastJsonAsm


为了图快还是先选择升级fastJson 版本先看看有没有问题。

<dependency> 
<groupId>com.alibaba</groupId> 
<artifactId>fastjson</artifactId> 
<version>1.2.47</version> 
</dependency> 

然后重复上述的观察

然后IBM的工具观察:

没有之前的实现方式了,说明新版本已经修复该bug了,最后决定升级版本ok。

fastjson 修复版本公告:https://www.oschina.net/news/86389/fastjson-1-2-34

展开阅读全文
打赏
0
3 收藏
分享
加载中
更多评论
打赏
0 评论
3 收藏
0
分享
返回顶部
顶部