目前我们一个服务,刚启动的时候,young gc耗时20毫秒左右,运行一天就到50毫秒了,重启后恢复正常,之后还会缓慢增长,该如何排查? 重启后gc日志:
重启11个小时后gc日志:
问下最大ygc 耗时是多久,还有最好把jvm参数贴一下😊
换fastjson新版本可以,我们是修改了Jackson代码
protected ObjectMapper mapper = new ObjectMapper(factory).setTimeZone(TimeZone.getDefault()); 复制
protected ObjectMapper mapper = new ObjectMapper(factory).setTimeZone(TimeZone.getDefault());
感谢反馈😋,这个问题是需要升级jackson 还是得更换别的json处理工具呢?
确实是String Table,我们切换了alijdk,加了参数-XX:+PrintGCRootsTraceTime ,打印了下gc分布时间,看到stringtable对比刚启动的时候明显增高,之后排查代码,发现只有Json那个地方有用到string转换,使用Jackson readValue触发的String.intern(),导致jvm stringtable膨胀。
执行一下 jmap -histo:live <pid> 试试,看 ygc 耗时是否会降低。JVM源码分析之String.intern()导致的YGC不断变长
jmap -histo:live <pid>
执行之后ygc立马就下降了
问下最大ygc 耗时是多久,还有最好把jvm参数贴一下😊