fastJson与一起堆内存溢出'血案'

2018-09-14  本文已影响0人  landon30

FastJson与一起堆内存溢出'血案'

现象

排查问题1--日志级别

 at java.lang.OutOfMemoryError.<init>()V (OutOfMemoryError.java:48)
  at com.alibaba.fastjson.serializer.SerializeWriter.expandCapacity(I)V (SerializeWriter.java:249)
-rw-------  1 xx xx 2043416350 Nov 24 11:37 java_pid8068.hprof
-rw-------  1 xx xx 2028797313 Nov 24 11:17 java_pid4671.hprof
-rw-------  1 xx xx 1477222612 Nov 23 23:25 java_pid31563.hprof

排查问题2--JVM命令级别

 num     #instances         #bytes  class name
----------------------------------------------
   1:        146219      741203672  [Ljava.lang.Object;
   2:       2842356      639498168  [C

排查问题3--专业工具级别

image image

image

image

分析问题1--观察数据

image

分析问题2--尝试重现

 HeroPersonality hp = new HeroPersonality();
 hp.setPersonalityLevel(1);
 String str = JSON.toJSONString(hp);

分析问题3--山重水复疑无路

PersonalityStrengthenConfig config = DataConfigService.
getSettingById(PersonalityStrengthenConfig.class, 1);

System.out.println("dcs.config1:" + config.cost);
System.out.println("dcs.config1:" + config.attr_num);

for (int i = 0; i < 10; i++) {
    String str1 = "{...}";
    JSON.parseObject(str1, HeroPersonality.class);
}

System.out.println("dcs.config2:" + config.cost);
System.out.println("dcs.config2:" + config.attr_num);

分析问题4--源代码跟踪

public JSONArray getNextTrainCost() {
    return ((PersonalityStrengthenConfig) getConfig()).cost;
}

@Override
public DataConfigItem getConfig() {
    return DataConfigService.getSettingById(PersonalityStrengthenConfig.class,
            personalityLevel);
}
// FieldDeserializer#setValue 其中method就是getNextTrainCost() 即获取方法的返回值然后加了一个null
Collection collection = (Collection) method.invoke(object);
if (collection != null) {
      collection.addAll((Collection) value);
}

分析问题5--问题初步总结

解决问题1--为什么cost会那么大

扩展

image
上一篇下一篇

猜你喜欢

热点阅读