美文网首页
记一次jdk及tomcat升级造成的问题(String.subs

记一次jdk及tomcat升级造成的问题(String.subs

作者: 内沐 | 来源:发表于2020-10-10 21:08 被阅读0次

    现象描述:

    系统,各主要软件版本如下: jdk:1.6, tomcat: 6.0 ,spring 3.2 ,mybatis:3.1.1,
    mybatis-spring-version:1.2.2. jdk与tomcat升级到1.8与8.0后.系统部分任务执行变慢.正常3分钟的任务,系统后需要12分钟.时间增加了4倍.

    分析: 慢的任务主要是操作数据库的任务.但问题直接瞪是瞪不出来的.所以只能把jvm的dump文件拿出来.下面是两个dump文件,一个是正常情况下的,一个是异常情况下的.


    image.png image.png

    发现异常情况下"java.lang.String"多一些,于是进入到里面看下都是什么操作

    image.png

    可以看出是操作数据库的sql.通过这个还是看不出来哪里有毛病,这时同事建议看下火焰图

    image.png

    从图中可以看到占用cpu时间最长的是 arryCopy那个也就是数组拷贝,而这个数据拷贝是由他下面的string.substring造成的.而这个是由于他下面的org/apache/ibatis/parsing/GenericTokenParser.parse 造成的.先分析下string.substring ,因为是jdk和tomcat升级造成的,所以先看下 不同版本jdk下这个方法有没有变动.结果是发生了变动.
    请参考:https://www.programcreek.com/2013/09/the-substring-method-in-jdk-6-and-jdk-7/

    简单来说就是jdk1.6中的substring只会产生一个对象,而jdk1.6+的substring会产生多个对象,中间需要拷贝.

    原因就是这个substirng造成的了,但又不能不升级,于是看调用substirng的地方,也就是火焰图中的GenericTokenParser.parse
    发现这个版本的mybatis 3.11在解析的时候大量调用了substring.

    image.png

    mybatis 高版本 3.4.5(虽然也不是很高,但受spring版本限制,只能升到这个版本了),发现已经用StringBuilder替换了.

    image.png

    所以只需升级mybatis和spring-mybatis就可以了.


    解决问题的过程中,火焰图起到了至关重要的作用.

    参考:
    http://www.ruanyifeng.com/blog/2017/09/flame-graph.html
    https://www.programcreek.com/2013/09/the-substring-method-in-jdk-6-and-jdk-7

    相关文章

      网友评论

          本文标题:记一次jdk及tomcat升级造成的问题(String.subs

          本文链接:https://www.haomeiwen.com/subject/lgrrpktx.html