V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
plko345
V2EX  ›  程序员

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

  •  1
     
  •   plko345 · 64 天前 · 2885 次点击
    这是一个创建于 64 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

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

    多谢大家, 大概就是这位老哥说的样子
    @cxshun
    @Ayanokouji
    @vituralfuture
    @L0L
    Plutooo
        15
    Plutooo  
       63 天前
    Mark 一下,除了一个个压测也没想到更好的方案,楼主要是有好的方案麻烦踹一下谢谢
    diagnostics
        16
    diagnostics  
       63 天前
    @cvbnt 太便捷了,有虚拟机就有 jconsole 类的工具,arthas 多下载一个软件还比自带的更便捷~
    seedhk
        17
    seedhk  
       63 天前
    换个角度想,与其思考每个应用要给多少内存,不如整体给一个大的,根据每个项目大概占用都少,多部署几个项目,内存不够用了,JVM 自己会 GC ,GC 失败 dump 会告警
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1023 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 20:46 · PVG 04:46 · LAX 12:46 · JFK 15:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.