请教 Java 程序如何观测真实的内存使用情况 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
plko345
V2EX    程序员

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

  •  1
     
  •   plko345 2024-09-22 12:25:03 +08:00 3559 次点击
    这是一个创建于 384 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    17 条回复    2024-09-23 10:33:09 +08:00
    F281M6Dh8DXpD1g2
        1
    F281M6Dh8DXpD1g2  
       2024-09-22 12:56:57 +08:00 via iPhone
    看 gclog 就行
    momocraft
        2
    momocraft  
       2024-09-22 13:03:01 +08:00
    开 gc log 然后面多加水
    plko345
        3
    plko345  
    OP
       2024-09-22 13:21:26 +08:00
    @liprais
    @momocraft
    有现成的作为 metric 导出的工具吗, 要监控和查看趋势的吧
    feimg99
        4
    feimg99  
       2024-09-22 15:31:28 +08:00
    jconsole or visualvm
    Java 没落成这样子了吗?这俩内置工具都没人知道?
    cxshun
        5
    cxshun  
       2024-09-22 15:40:14 +08:00
    真实使用的内存如果可以连接就用楼上的 jconsole 或 visualvm ,如果不行,就直接 dump 出来看,dump 出来的时候会强制 GC 一致,后面就是真实占用的内存了。

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

    metrics 的话 spring actuator 里面有包含 jvm.used 类似的,可以参考下
    Ayanokouji
        6
    Ayanokouji  
       2024-09-22 15:40:18 +08:00
    实时预览工具 arthas
    springboot 项目 spring-boot-starter-actuator
    prometheus 有 jmx_exporter

    唉,论监控或者运维生态,有几个语言能和 java 比的
    vituralfuture
        7
    vituralfuture  
       2024-09-22 17:38:19 +08:00 via Android
    python 也有虚拟机,也会占用更多内存但不使用,这点跟 java 是一样的

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

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

    多谢大家, 大概就是这位老哥说的样子
    @cxshun
    @Ayanokouji
    @vituralfuture
    @L0L
    Plutooo
        15
    Plutooo  
       2024-09-23 09:08:10 +08:00
    Mark 一下,除了一个个压测也没想到更好的方案,楼主要是有好的方案麻烦踹一下谢谢
    diagnostics
        16
    diagnostics  
       2024-09-23 09:18:14 +08:00
    @cvbnt 太便捷了,有虚拟机就有 jconsole 类的工具,arthas 多下载一个软件还比自带的更便捷~
    seedhk
        17
    seedhk  
       2024-09-23 10:33:09 +08:00
    换个角度想,与其思考每个应用要给多少内存,不如整体给一个大的,根据每个项目大概占用都少,多部署几个项目,内存不够用了,JVM 自己会 GC ,GC 失败 dump 会告警
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2565 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 02:02 PVG 10:02 LAX 19:02 JFK 22:02
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86