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