• 通过jmap、jstack分析问题,以及分析方法


    一、问题

            多批次导入任务,会出现异步线程停止工作的情况,后续无论导入多少任务,异步线程都不会执行,只有重启能解决。

    二、工具使用

    进入jdk的bin目录:

    cd /beeb/ap/uip/jdk1.8.0_231/bin

    2.1 拉取jstack日志:

    ./jstack -l 28406 >./sp-dbms.jstack.log

    其中28406是服务进程号。

    2.2 通过jmap分析:

    ./jmap -dump:live,format=b,file=/beeb/ap/uip/agent/udp-logs/sp-dbms/appLogs/sp-dbms-heap.bin 28406

    2.2.1 使用jhat工具:

    1.启动jhat:

    jhat xxx.dump

    实战图:

     jhat命令后面跟的是文件名,这个文件名的后缀可以是.dump,也可以是.bin,具体要看你到出的文件后缀。

    2.启动后,就可以访问:http://127.0.0.1:7000/

    jhat工具页面截图

     通过分析堆内存没看出有什么异常,于是我掉头又去查看了sp-dbms.jstack.log日志。

    三、分析jstack日志

    3.1 查看jstack日志

            可以看的下图中,对应的线程信息,async-import-16(就是我用到的线程池)线程属于WAITING状态,并且parking to wait for (CountDownLatch),那么我可以猜测,是不是因为CountDownLatch这个共享锁因为某些原因没有释放出来?

     3.2 查看代码

            查看代码,捕获异常后更新数据,插入失败状态以及失败原因,这里有可能出现数据库连接等异常,导致下面的latch.countDown()未执行,继而出现线程一直在等待的问题:

     

     3.3 解决方法

    在第一个红框出的update...方法处try...catch一下就行了。

    四、java visualVM使用步骤

    解决这个问题没有用到java visualVM工具,但我也记录一下它的使用步骤:

    4.1 找到jdk的bin路径

     打开jvisualvm.exe。

    4.2 加载我们之前jmap拉下来的xx-heap.dump或xx-heap.bin文件

     

     

    4.3 接下来就可以分析了

    具体分析方法以后再阐述。 

  • 相关阅读:
    Nwafu-OJ-1508 Problem 阶段2考试题目5 变位词统计
    【活动系列】那些年写的比较愚蠢的代码
    协方差矩阵半正定性的证明
    NeurIPS 22|四分钟内就能训练目标检测器!( AGVM)
    自定义IDOC配置
    Redis缓存与从数据取数据性能比较
    JAVASketch2Mod网站计算机毕业设计Mybatis+系统+数据库+调试部署
    02-Redis持久化、主从复制
    【文件终结者 Objective-C语言】
    制作一个简单HTML宠物猫网页(HTML+CSS)
  • 原文地址:https://blog.csdn.net/moneywenxue/article/details/127436108