请教 Java 程序如何观测真实的内存使用情况

60 天前
 plko345

生产如何观测 java 内存的真实使用情况, 比如其它的语言 go, C, python... 占用情况操作系统会真实反映出来, 但 java 的真实情况被一层虚拟机屏蔽了

比如有多个应用 -xms 16g -xmx 16g, 我要怎么知道哪些实际只需要 1g, 哪些需要更多呢, 尝试使用 jmx_exporter 内存趋势也看不出来什么, 有些看上去线性的涨到最高, 然后马上下降(可能是 GC?), 有些完全没规律.

有什么技巧可以简单有效的观测真实内存需要, 麻烦分享下

2879 次点击
所在节点    程序员
17 条回复
liprais
60 天前
看 gclog 就行
momocraft
60 天前
开 gc log 然后面多加水
plko345
60 天前
@liprais
@momocraft
有现成的作为 metric 导出的工具吗, 要监控和查看趋势的吧
feimg99
60 天前
jconsole or visualvm
Java 没落成这样子了吗?这俩内置工具都没人知道?
cxshun
60 天前
真实使用的内存如果可以连接就用楼上的 jconsole 或 visualvm ,如果不行,就直接 dump 出来看,dump 出来的时候会强制 GC 一致,后面就是真实占用的内存了。

但如果你只是想看整个应用使用的内存,直接看 Top 的 RES 就好了,当然,这里包含了堆外内存,你的意思是只看堆内内存就考虑用上面的方式。

metrics 的话 spring actuator 里面有包含 jvm.used 类似的,可以参考下
Ayanokouji
60 天前
实时预览工具 arthas
springboot 项目 spring-boot-starter-actuator
prometheus 有 jmx_exporter

唉,论监控或者运维生态,有几个语言能和 java 比的
vituralfuture
60 天前
python 也有虚拟机,也会占用更多内存但不使用,这点跟 java 是一样的

实际上额外占用内存是绝大部分内存管理系统的共同做法,哪怕你用 C 的 malloc ,也会出现实际占用内存大于需要的内存

内存管理系统要解决的问题就是快速分配内存的同时减少内存碎片,常见的实现方法中基本都有内存池的维护
kandaakihito
60 天前
准备一把十字螺丝刀,卸下底部所有螺丝即可取下 JVM 虚拟机的后盖,移开顶部的电池和排线就能看到内存了(逃
cvbnt
60 天前
最便捷的还是 arthas
L0L
60 天前
你的目的是干啥呢?需要更加精细的管控内存?从你的描述来看,你希望优化一下目前的应用的 jvm 参数,调整到最优的状态?
kneo
60 天前
最简单的应该是 jstat
Plutooo
60 天前
感觉楼上各位说的并不是楼主真正需要的,楼主真正需要的应该是类似于“这个应用程序最小需要分配多少内存可以正常运行”,楼主已经能观测到内存曲线,但对于 JVM 来说,在没有触发阈值的情况下,理论上是有多少就能占用多少的,触发了阈值回收后堆内存占用又会下降,可以试试不追求极致性能的情况下,xms 设小一点,不需要设置得跟 xmx 一样
star574
60 天前
VisualVM 安装 VisualGC 插件,arthas
最烦的是 jstatd 随机端口,每次都得去安全组开
plko345
59 天前
@Plutooo 多谢, 大概情况就是你说的, 我们在 K8S 和服务器上, 尽量给够资源, 但又不想浪费, 都是钱, 如果是其它语言实现的, 我给 16G 内存, 它长期低于 1G, 峰值 2G, 我们肯定要考虑降低配置, 给个 4G, 但 java 就不知道怎么办了, 有时服务器内存资源占用很高, 都是配置的大, 但它真正需要多少, 得花不少时间一个一个分析, 实际还得压测才知道, 但 100 多个服务, 非常费时不讨好

多谢大家, 大概就是这位老哥说的样子
@cxshun
@Ayanokouji
@vituralfuture
@L0L
Plutooo
59 天前
Mark 一下,除了一个个压测也没想到更好的方案,楼主要是有好的方案麻烦踹一下谢谢
diagnostics
59 天前
@cvbnt 太便捷了,有虚拟机就有 jconsole 类的工具,arthas 多下载一个软件还比自带的更便捷~
seedhk
59 天前
换个角度想,与其思考每个应用要给多少内存,不如整体给一个大的,根据每个项目大概占用都少,多部署几个项目,内存不够用了,JVM 自己会 GC ,GC 失败 dump 会告警

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

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

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

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

© 2021 V2EX