Java 应用启动很慢,咋分析和优化?

2021-05-29 10:03:34 +08:00
 x97bgt

现在接手的 java 应用,启动要 3+分钟,加载 9000+个类,给虚拟机分配 20+G 的内存才够用。

我在想有没有什么方法能优化的,比如提升重启速度,或者减少所需内存。

用了 arthas 和 jconsole 一通乱看,分析不出所以然来。有啥好的分析方法或思路,能找到优化的突破口么?

4782 次点击
所在节点    Java
24 条回复
mazyi
2021-05-29 10:39:32 +08:00
先从启动日志看起
FanError
2021-05-29 10:40:00 +08:00
试试是不是这个引起的呀
-Djava.security.egd=file:/dev/./urandom

搜 tomcat 随机数 启动慢
546L5LiK6ZOt
2021-05-29 11:48:53 +08:00
用 visualvm 看启动时哪些方法耗时最长
x97bgt
2021-05-29 11:55:54 +08:00
@mazyi 你的意思是,从 log 里分析,哪部分花的时间长?这个比较依赖 log 吧??
x97bgt
2021-05-29 11:57:25 +08:00
@FanError 我们用的 jetty 。。。
x97bgt
2021-05-29 11:58:34 +08:00
@546L5LiK6ZOt visualvm 可以自动列出启动时所运行的方法和时间吗?我用 arthas,需要你自己给出方法的签名。
liudaolunhuibl
2021-05-29 12:00:20 +08:00
看下代码,根据我之前的经验这种项目会在 spring 的 bean 加载的时候做很多骚操作,比如请求某服务获取数据然后加载到内存中来,甚至查数据库。
fantastM
2021-05-29 12:32:03 +08:00
我记得 arthas 支持 profiler,还可以生成火焰图(不过我没用过
Vegetable
2021-05-29 12:34:34 +08:00
像极了从数据库读几个 G 的数据到内存
opengps
2021-05-29 12:43:33 +08:00
20+G ? 这个规模的数据集光从硬盘加载到内存就几乎占据了你全部的启动时间,想要快那恐怕先考虑换更快的硬盘吧
micean
2021-05-29 15:48:14 +08:00
指定 spring 加载的 package 范围试试?先把根源找出来
wanacry
2021-05-29 17:33:47 +08:00
@opengps 3g 每秒的固态 20g 也就几秒啊
x97bgt
2021-05-29 18:32:09 +08:00
@fantastM 有火焰图,但好像就是一个纵览。看了不知道咋分析。。。
x97bgt
2021-05-29 18:34:44 +08:00
@opengps 20 个 G 内存应该不是全用来存放加载的数据吧,但我不大懂瓶颈在哪。。。
x97bgt
2021-05-29 18:36:33 +08:00
@liudaolunhuibl
@Vegetable
@opengps
@fantastM
@wanacry
有啥办法可以看到 JVM 所占用内存的使用情况和分布吗?比如,可以具体到看某个类的字节码和实例的占用内存大小。
beitayongguo
2021-05-30 00:45:32 +08:00
还是优先分析启动日志吧。可以开下 debug 日志。比如连接某些中间件一直卡在那?比如启动时 bean 做了大量 depends on ? 如果从日志分析不出啥,是不是可以考虑拆些子模块到其他应用做做瘦身?
vitoliu
2021-05-30 00:54:37 +08:00
启动慢的问题可以用 jprofile 监视一下问题出在哪儿,heapdump 快照看看
opengps
2021-05-30 10:12:33 +08:00
@x97bgt
14# 程序读取数据跟硬盘里拷贝大文件性质并不一致,所以几乎必然达不到硬盘的最高速度。粗略估算的话可以把速度减半来理解
15# 确实很多初始化的变量本身也占用较多内存,尤其是那些大量的集合,再加上这么多类库初始化的时候,很有可能很多类库都存在变量从硬盘取数赋值等小块读取硬盘的情况,会让程序的加载速度更慢,硬盘速度在这个情境下就要进一步打折了。这还不含首次启动时候 sdk 本身的调用
e583409
2021-05-30 10:38:10 +08:00
这是一道很好的面试题 哈哈
liudaolunhuibl
2021-05-30 14:09:10 +08:00
@x97bgt 好像 dump 堆栈日志可以看到,但是启动慢和你堆分布有什么关系,你现在是想解决启动慢还是堆过大

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

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

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

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

© 2021 V2EX