如何定位 java 程序执行时间长的原因?
现在的问题是有一个定时程序执行一遍需要 1500 分钟,我需要减少执行时间,
而这个程序代码量也很大(多线程去遍历,然后统计数据 导出数据 删除数据),那么现在需要去定位什么原因导致的,有没有优化空间
有什么可以定位问题的工具? 我晓得的有 JProfiler 和 Arthas 但是具体用哪个功能,感到很迷茫,有的功能还对线上有比较大的影响
程序逻辑
目前有一个 600G 的 kvrocks 集群(一个基于硬盘的类似 redis 的服务),然后每天需要遍历所有内容(开了大概 150 个线程去跑,因为读取 kvrocks 数据需要等待 io,于是开的线程多一些),为了实现业务需求主要有几个操作
[ol]
[/ol]
机器配置
cpu 10 核 20 线程 两个 (因为机器还在跑别的程序,基本已经跑满了 这个程序占用 3486% cpu)
内存 256G (这个程序占用 64G -Xmx64G)
我能做的
[ol]
[/ol]
[root@*** ~]# jstat -gcutil 39822
S0 S1 E O M CCS YGC YGCT FGC FGCT CGC CGCT GCT
0.00 94.84 29.51 51.33 98.33 93.37 28468 1151.061 0 0.000 16 4.057 1155.118
[ol]
我有想过用 jstack 看看执行到哪里,不过这个程序是个大循环,一直都是那些代码再跑,看了貌似也没啥用
我现在只能去读代码,这种我感觉并不是对症下药,就是靠经验以及靠猜,这并不是一个好的解决问题的方法,所以在此求助各位大佬
[/ol]