Java 程序执行时间太长优化的问题,求大佬解答

2023-08-29 10:06:39 +08:00
 chenfang

我现在的问题

如何定位 java 程序执行时间长的原因?

现在的问题是有一个定时程序执行一遍需要 1500 分钟,我需要减少执行时间,

而这个程序代码量也很大(多线程去遍历,然后统计数据 导出数据 删除数据),那么现在需要去定位什么原因导致的,有没有优化空间

有什么可以定位问题的工具? 我晓得的有 JProfiler 和 Arthas 但是具体用哪个功能,感到很迷茫,有的功能还对线上有比较大的影响

程序逻辑

目前有一个 600G 的 kvrocks 集群(一个基于硬盘的类似 redis 的服务),然后每天需要遍历所有内容(开了大概 150 个线程去跑,因为读取 kvrocks 数据需要等待 io,于是开的线程多一些),为了实现业务需求主要有几个操作

  1. 删除过期的数据
  2. 导出一些数据到文件
  3. 插入 MQ 一些数据

机器配置

cpu 10 核 20 线程 两个 (因为机器还在跑别的程序,基本已经跑满了 这个程序占用 3486% cpu)

内存 256G (这个程序占用 64G -Xmx64G)

我能做的

  1. 查看 GC 情况,并没有 FGC,所以不是 FGC 导致的执行慢
[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
  1. 我有想过用 jstack 看看执行到哪里,不过这个程序是个大循环,一直都是那些代码再跑,看了貌似也没啥用

  2. 我现在只能去读代码,这种我感觉并不是对症下药,就是靠经验以及靠猜,这并不是一个好的解决问题的方法,所以在此求助各位大佬

2530 次点击
所在节点    程序员
22 条回复
szzadkk
2023-08-29 15:14:00 +08:00
用 arthas 的 profile start -e wall 生成火焰图,看函数的执行时间挨个分析就行
ihuotui
2023-08-29 22:01:13 +08:00
应该把任务做并发性能测试,1-10-100-100000 这样递增测试,看看是否效率提升,然后找性能瓶颈

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/969080

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX