JAR 包上线内存消耗很大如何精准定位到问题处?

2022-05-16 15:50:32 +08:00
 godleon

新的 aliyun-centos7, jar 内几乎都是 crud ,没有访问请求,jar 包 80M 左右,启动之后内存占用了 1 个 G ;

这个是 java 的基操还是说是我包的问题,还是我服务器的问题,如果该如何定位 怎么解决?

首先排除启动时给 jar 设置限制大小的操作!

2655 次点击
所在节点    Java
18 条回复
RedBeanIce
2022-05-16 15:55:19 +08:00
拉下来看看内存里面都是什么
RedBeanIce
2022-05-16 15:55:26 +08:00
dump
BBCCBB
2022-05-16 15:55:59 +08:00
jdk 设置的最大内存多大? 他会一直到最大内存才开始回收..

如果不是这个问题. jmap dump 几次内存下来分析?
godleon
2022-05-16 15:57:28 +08:00
@RedBeanIce 本地开发环境启动后内存开销正常,但是放到线上 我用 nohup 后台运行以后,占用内存很大了,也没有任何日志输出
chendy
2022-05-16 16:00:21 +08:00
java 命令不加参数默认最大堆是物理内存 1/4 ,加上 meta space 之类的实际使用可能会更多,不加参数限制慢慢就会吃到那么多
觉得占用太大就加参数做限制,但是内存太小会影响性能
觉得内存占用不正常就 dump 内存用 mat 之类的工具做分析定位问题
godleon
2022-05-16 16:00:56 +08:00
@BBCCBB 没有设置内存大小,应该是服务器内存的 1/4 吧
sorakylin
2022-05-16 16:02:15 +08:00
dump + MAT 分析, 解君愁
seaswalker
2022-05-16 16:03:19 +08:00
1g 这不是 java 常规操作
fuis
2022-05-16 16:03:24 +08:00
jconsole 连进去看
godleon
2022-05-16 16:09:39 +08:00
@fuis
@sorakylin
@chendy

我试试吧,我也不知道我这水平能不能分析出来个 123
someonedeng
2022-05-16 16:09:54 +08:00
dump 看看什么情况先
zifangsky
2022-05-16 16:48:18 +08:00
# 查看进程 pid ,假如查出来是 12767
$ ps -ef | grep java

# 查看当前堆栈情况
$ sudo jmap -heap 12767

先看看堆栈情况,是不是默认设置得比较大
zmal
2022-05-16 16:50:12 +08:00
运行内存和你的 jar 包大小又没啥关系···和启动参数有关。
dqzcwxb
2022-05-16 16:57:21 +08:00
jvm 占用内存和实际需要内存是两码事而且跟你包大小没有比例关系,你这就是正常的没设置-Xmx 导致使用了默认的 1/4 物理内存
godleon
2022-05-16 17:20:22 +08:00
@dqzcwxb
@zmal
@zifangsky
那我是不是可以这样理解,假设我现在有 4 个 JAR 都是空包,我现在不加-Xmx 启动放到 8G 服务器上,是不是我放完 4 个包,啥也不用干就吃满了。
zmal
2022-05-16 17:37:08 +08:00
jvm 没这么傻,linux 也没这么傻。
jorneyr
2022-05-16 17:50:25 +08:00
jmap 查看哪些对象占用内存大,生成火焰图看看内存情况。
常见的是不是使用 Map 存储了大量缓存对象。
线上环境的 -Xms 和 -Xmx 是不是都设置为同一个值了。
lmshl
2022-05-16 17:50:57 +08:00
https://github.com/zio/zio/pull/6807
https://github.com/zio/zio-zmx/pull/370

最近给某个并发纤程库修了几个 OOM 的 bug ,也来分享下工具。

https://docs.oracle.com/javase/7/docs/technotes/guides/management/agent.html
应用启动时开启 jmx 选项,用 jvisualvm 远程连上去可以看实时内存和线程状态,也可以 dump 堆进行一些简单的分析。

https://wiki.eclipse.org/MemoryAnalyzer
应用运行时可以 jmap 生成堆文件,拉下来扔进 mat 分析,无脑选内存泄漏面板就够了。

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

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

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

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

© 2021 V2EX