2018-11-11 線上機器永久帶發生了oom,永久帶oom大部分有關的就是反射,和類加載器不斷新增(我是帶着這個思惟去找問題)。java
2018-11-13 根據線上dump的堆棧信息,定位到發生oom的線程棧json
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>
用法:
google
Result resultObj = JSON.parseObject("{\"success\":false,\"errorType\":0,\"data\":{\"name\":\"nihao\",\"test\":\"nihao22\"}}", new TypeToken>(){}.getType()); `
2018-11-13 採用放大現象 多線程,幾十萬次反覆調用(其實和線上場景差很少,線上是15個線程,200w次調用).net
根據jdk下的jvisualvm,觀察: 已裝入類,和PermGen區線程
發如今瘋狂的增加,說明永久帶的oom 真有多是這兩個版本,和用法致使的。3d
使用IBM的分析工具觀察Class List: 發現確實在不斷的增長FastJsonAsmcode
爲了圖快仍是先選擇升級fastJson 版本先看看有沒有問題。xml
<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