生产如何观测 java 内存的真实使用情况, 比如其它的语言 go, C, python... 占用情况操作系统会真实反映出来, 但 java 的真实情况被一层虚拟机屏蔽了
比如有多个应用 -xms 16g -xmx 16g
, 我要怎么知道哪些实际只需要 1g, 哪些需要更多呢, 尝试使用 jmx_exporter 内存趋势也看不出来什么, 有些看上去线性的涨到最高, 然后马上下降(可能是 GC?), 有些完全没规律.
有什么技巧可以简单有效的观测真实内存需要, 麻烦分享下
1
liprais 39 天前 via iPhone
看 gclog 就行
|
2
momocraft 39 天前
开 gc log 然后面多加水
|
4
feimg99 39 天前
jconsole or visualvm
Java 没落成这样子了吗?这俩内置工具都没人知道? |
5
cxshun 39 天前
真实使用的内存如果可以连接就用楼上的 jconsole 或 visualvm ,如果不行,就直接 dump 出来看,dump 出来的时候会强制 GC 一致,后面就是真实占用的内存了。
但如果你只是想看整个应用使用的内存,直接看 Top 的 RES 就好了,当然,这里包含了堆外内存,你的意思是只看堆内内存就考虑用上面的方式。 metrics 的话 spring actuator 里面有包含 jvm.used 类似的,可以参考下 |
6
Ayanokouji 39 天前
实时预览工具 arthas
springboot 项目 spring-boot-starter-actuator prometheus 有 jmx_exporter 唉,论监控或者运维生态,有几个语言能和 java 比的 |
7
vituralfuture 39 天前 via Android
python 也有虚拟机,也会占用更多内存但不使用,这点跟 java 是一样的
实际上额外占用内存是绝大部分内存管理系统的共同做法,哪怕你用 C 的 malloc ,也会出现实际占用内存大于需要的内存 内存管理系统要解决的问题就是快速分配内存的同时减少内存碎片,常见的实现方法中基本都有内存池的维护 |
8
kandaakihito 39 天前
准备一把十字螺丝刀,卸下底部所有螺丝即可取下 JVM 虚拟机的后盖,移开顶部的电池和排线就能看到内存了(逃
|
9
cvbnt 39 天前 via Android
最便捷的还是 arthas
|
10
L0L 39 天前
你的目的是干啥呢?需要更加精细的管控内存?从你的描述来看,你希望优化一下目前的应用的 jvm 参数,调整到最优的状态?
|
11
kneo 39 天前 via Android
最简单的应该是 jstat
|
12
Plutooo 39 天前 2
感觉楼上各位说的并不是楼主真正需要的,楼主真正需要的应该是类似于“这个应用程序最小需要分配多少内存可以正常运行”,楼主已经能观测到内存曲线,但对于 JVM 来说,在没有触发阈值的情况下,理论上是有多少就能占用多少的,触发了阈值回收后堆内存占用又会下降,可以试试不追求极致性能的情况下,xms 设小一点,不需要设置得跟 xmx 一样
|
13
star574 39 天前
VisualVM 安装 VisualGC 插件,arthas
最烦的是 jstatd 随机端口,每次都得去安全组开 |
14
plko345 OP @Plutooo 多谢, 大概情况就是你说的, 我们在 K8S 和服务器上, 尽量给够资源, 但又不想浪费, 都是钱, 如果是其它语言实现的, 我给 16G 内存, 它长期低于 1G, 峰值 2G, 我们肯定要考虑降低配置, 给个 4G, 但 java 就不知道怎么办了, 有时服务器内存资源占用很高, 都是配置的大, 但它真正需要多少, 得花不少时间一个一个分析, 实际还得压测才知道, 但 100 多个服务, 非常费时不讨好
多谢大家, 大概就是这位老哥说的样子 @cxshun @Ayanokouji @vituralfuture @L0L |
15
Plutooo 39 天前
Mark 一下,除了一个个压测也没想到更好的方案,楼主要是有好的方案麻烦踹一下谢谢
|
16
diagnostics 39 天前
@cvbnt 太便捷了,有虚拟机就有 jconsole 类的工具,arthas 多下载一个软件还比自带的更便捷~
|
17
seedhk 39 天前
换个角度想,与其思考每个应用要给多少内存,不如整体给一个大的,根据每个项目大概占用都少,多部署几个项目,内存不够用了,JVM 自己会 GC ,GC 失败 dump 会告警
|