Java 很普通的代码执行很慢

2020-04-08 08:59:59 +08:00
 burnbrid

大家好,我们生产系统上面现在有一个接口,这个接口里面的代码有的时候运行很慢,后来我把代码分成了好几段,每段代码前后都加了开始时间和结束时间。今天下午 2020/4/7 14:48:00 的时候,运维找我说又发现客户调了这个接口,我们 9 秒才返回结果。我去生产上把日志下载下来,发现在 2020/4/7 14:25:22 的时候,有一段很普通的 JAVA 代码(就是从一个对象上面调 get 方法,获取数据,不涉及 SQL 和多线程)确实运行了 9 秒。然后,我用同样的参数又调了一下那个接口,400 毫秒就返回了。邪门的是,并不是每次慢都是这段代码,有的时候是另外一段,有的时候又是另外一段代码。请问这种情况,你们是怎么分析问题并解决问题的?难道这种问题就解决不了吗?这种情况发生的不是太频繁,几乎 1 到 2 周会发生一次。我个人分析如下:1 、肯定不是 JAVA 代码的问题,因为这些代码都很简单,很普通。也不是数据库的问题。更不是网络的问题,因为就是那段普通 JAVA 代码运行了 9 秒。2 、既然不是 JAVA 代码和数据库、网络的问题,那么有可能是 JVM 的问题或者服务器的 CPU 或者 IO 的问题。现在我就是要找代码慢的那个时刻的 JVM 的概况和当时服务器 CPU 或者 IO 的概况。我想在代码中把 JVM 当时的堆栈内存情况打印出来。还有把当时服务器的 CPU 和 IO 概况也打印出来。不知道这样做是否可行?各位 JAVA 大神给支点大招,谢谢各位大神。

8291 次点击
所在节点    Java
44 条回复
ic2y
2020-04-08 09:03:39 +08:00
1.你的问题的格式 看起来 很乱,没有分行?

2.如果是这种奇怪的问题,你得贴代码,还有平台、jdk 版本;只描述信息,没人看得懂
redford42
2020-04-08 09:08:08 +08:00
蹲点一下看走近科学结局
cheng6563
2020-04-08 09:08:35 +08:00
是不是开了 swap 内存不足了
Aresxue
2020-04-08 09:11:47 +08:00
jstack 看线程,打印什么的不靠谱,不一定是业务线程。我这就遇到过很多其他处理阻塞主程的操作, 比如日志输出(输出流重定向到 kafka )因为用的第三方库不够健壮一步发送 kafka 消息阻塞了业务线程。
madizmChou
2020-04-08 09:12:28 +08:00
多大的对象
Aresxue
2020-04-08 09:13:09 +08:00
条件允许直接上 arthas,把你整个函数切成片分析
VoidChen
2020-04-08 09:13:20 +08:00
我觉得是可能是资源占用问题,可以排查下服务器上部署了哪些组件,重点关注那些数据库或者搜索引擎,像 redis 或者 es 那种
TMaize
2020-04-08 09:13:34 +08:00
代码里面有没有用生成随机数的相关函数
micean
2020-04-08 09:22:06 +08:00
这种第一次慢,后面恢复正常的情况都是网络 IO 连接池假连接造成的
sagaxu
2020-04-08 09:22:54 +08:00
没有 gc 日志? fgc 叠加 swap 能卡几十秒,在内存 32G,剩余 20G 以上的情况下。
arthas2234
2020-04-08 09:28:18 +08:00
码字的时候能不能,分一下段落
fzhyzamt
2020-04-08 09:34:24 +08:00
你这什么条件都没,只能靠猜啊
1. gc
2. 插的桩有问题
3. 那个对象是个代理,实际上是 IO
4. 机器卡死
5. 拿不到 CPU
sampeng
2020-04-08 09:52:32 +08:00
监控都没,这不叫分析,这叫蒙
nicevar
2020-04-08 10:02:50 +08:00
就你这个描述,James Gosling 来了也跟我在同一水平线上。。。
问题不是出在语言上,可能出在环境或资源占用上
sherlockJuan
2020-04-08 10:07:49 +08:00
手写 JDBCTemplate,压测试试,之前我们碰到过类似的问题,发现是有些类没管理好,访问量一上去,总是会重新创建对象,就变慢了
nanguaboy
2020-04-08 10:12:22 +08:00
我猜一下,可能是随机数的原因
thoreyunpeng
2020-04-08 10:14:25 +08:00
是不是 FGC 了 记录时间看 GCLog 吧
shenlanAZ
2020-04-08 10:22:48 +08:00
你这是在写日记
MOETAN0
2020-04-08 10:24:37 +08:00
建议先做这 2 个事情:
1,开启 jvm 的 GC 详细日志
2,使用 nmon 等 linux 性能监控工具记录服务器运行性能指标
haoz1w0w
2020-04-08 10:27:26 +08:00
盲猜随机数

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

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

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

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

© 2021 V2EX