新的 aliyun-centos7, jar 内几乎都是 crud ,没有访问请求,jar 包 80M 左右,启动之后内存占用了 1 个 G ;
这个是 java 的基操还是说是我包的问题,还是我服务器的问题,如果该如何定位 怎么解决?
首先排除启动时给 jar 设置限制大小的操作!
1
RedBeanIce 2022-05-16 15:55:19 +08:00
拉下来看看内存里面都是什么
|
2
RedBeanIce 2022-05-16 15:55:26 +08:00
dump
|
3
BBCCBB 2022-05-16 15:55:59 +08:00
jdk 设置的最大内存多大? 他会一直到最大内存才开始回收..
如果不是这个问题. jmap dump 几次内存下来分析? |
4
godleon OP @RedBeanIce 本地开发环境启动后内存开销正常,但是放到线上 我用 nohup 后台运行以后,占用内存很大了,也没有任何日志输出
|
5
chendy 2022-05-16 16:00:21 +08:00
java 命令不加参数默认最大堆是物理内存 1/4 ,加上 meta space 之类的实际使用可能会更多,不加参数限制慢慢就会吃到那么多
觉得占用太大就加参数做限制,但是内存太小会影响性能 觉得内存占用不正常就 dump 内存用 mat 之类的工具做分析定位问题 |
7
sorakylin 2022-05-16 16:02:15 +08:00
dump + MAT 分析, 解君愁
|
8
seaswalker 2022-05-16 16:03:19 +08:00 via iPhone
1g 这不是 java 常规操作
|
9
fuis 2022-05-16 16:03:24 +08:00
jconsole 连进去看
|
11
someonedeng 2022-05-16 16:09:54 +08:00
dump 看看什么情况先
|
12
zifangsky 2022-05-16 16:48:18 +08:00
# 查看进程 pid ,假如查出来是 12767
$ ps -ef | grep java # 查看当前堆栈情况 $ sudo jmap -heap 12767 先看看堆栈情况,是不是默认设置得比较大 |
13
zmal 2022-05-16 16:50:12 +08:00
运行内存和你的 jar 包大小又没啥关系···和启动参数有关。
|
14
dqzcwxb 2022-05-16 16:57:21 +08:00
jvm 占用内存和实际需要内存是两码事而且跟你包大小没有比例关系,你这就是正常的没设置-Xmx 导致使用了默认的 1/4 物理内存
|
15
godleon OP |
16
zmal 2022-05-16 17:37:08 +08:00
jvm 没这么傻,linux 也没这么傻。
|
17
jorneyr 2022-05-16 17:50:25 +08:00
jmap 查看哪些对象占用内存大,生成火焰图看看内存情况。
常见的是不是使用 Map 存储了大量缓存对象。 线上环境的 -Xms 和 -Xmx 是不是都设置为同一个值了。 |
18
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 分析,无脑选内存泄漏面板就够了。 |