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

JAR 包上线内存消耗很大如何精准定位到问题处?

  •  
  •   godleon · 2022-05-16 15:50:32 +08:00 · 2650 次点击
    这是一个创建于 948 天前的主题,其中的信息可能已经有所发展或是发生改变。

    新的 aliyun-centos7, jar 内几乎都是 crud ,没有访问请求,jar 包 80M 左右,启动之后内存占用了 1 个 G ;

    这个是 java 的基操还是说是我包的问题,还是我服务器的问题,如果该如何定位 怎么解决?

    首先排除启动时给 jar 设置限制大小的操作!

    第 1 条附言  ·  2022-05-16 18:37:22 +08:00
    1.线上 dump 拉下来了,转成 jps 文件,在 JProfiler 打开分析,内存占用在 30M
    2.使用 java visualVM 远程链接线上实时监控 内存占用在 90M
    3.jmap -heap pid 显示占用 300M
    4.top -p XX 显示占用 990M

    这是算正常还是异常~
    18 条回复    2022-05-16 17:50:57 +08:00
    RedBeanIce
        1
    RedBeanIce  
       2022-05-16 15:55:19 +08:00
    拉下来看看内存里面都是什么
    RedBeanIce
        2
    RedBeanIce  
       2022-05-16 15:55:26 +08:00
    dump
    BBCCBB
        3
    BBCCBB  
       2022-05-16 15:55:59 +08:00
    jdk 设置的最大内存多大? 他会一直到最大内存才开始回收..

    如果不是这个问题. jmap dump 几次内存下来分析?
    godleon
        4
    godleon  
    OP
       2022-05-16 15:57:28 +08:00
    @RedBeanIce 本地开发环境启动后内存开销正常,但是放到线上 我用 nohup 后台运行以后,占用内存很大了,也没有任何日志输出
    chendy
        5
    chendy  
       2022-05-16 16:00:21 +08:00
    java 命令不加参数默认最大堆是物理内存 1/4 ,加上 meta space 之类的实际使用可能会更多,不加参数限制慢慢就会吃到那么多
    觉得占用太大就加参数做限制,但是内存太小会影响性能
    觉得内存占用不正常就 dump 内存用 mat 之类的工具做分析定位问题
    godleon
        6
    godleon  
    OP
       2022-05-16 16:00:56 +08:00
    @BBCCBB 没有设置内存大小,应该是服务器内存的 1/4 吧
    sorakylin
        7
    sorakylin  
       2022-05-16 16:02:15 +08:00
    dump + MAT 分析, 解君愁
    seaswalker
        8
    seaswalker  
       2022-05-16 16:03:19 +08:00 via iPhone
    1g 这不是 java 常规操作
    fuis
        9
    fuis  
       2022-05-16 16:03:24 +08:00
    jconsole 连进去看
    godleon
        10
    godleon  
    OP
       2022-05-16 16:09:39 +08:00
    @fuis
    @sorakylin
    @chendy

    我试试吧,我也不知道我这水平能不能分析出来个 123
    someonedeng
        11
    someonedeng  
       2022-05-16 16:09:54 +08:00
    dump 看看什么情况先
    zifangsky
        12
    zifangsky  
       2022-05-16 16:48:18 +08:00
    # 查看进程 pid ,假如查出来是 12767
    $ ps -ef | grep java

    # 查看当前堆栈情况
    $ sudo jmap -heap 12767

    先看看堆栈情况,是不是默认设置得比较大
    zmal
        13
    zmal  
       2022-05-16 16:50:12 +08:00
    运行内存和你的 jar 包大小又没啥关系···和启动参数有关。
    dqzcwxb
        14
    dqzcwxb  
       2022-05-16 16:57:21 +08:00
    jvm 占用内存和实际需要内存是两码事而且跟你包大小没有比例关系,你这就是正常的没设置-Xmx 导致使用了默认的 1/4 物理内存
    godleon
        15
    godleon  
    OP
       2022-05-16 17:20:22 +08:00
    @dqzcwxb
    @zmal
    @zifangsky
    那我是不是可以这样理解,假设我现在有 4 个 JAR 都是空包,我现在不加-Xmx 启动放到 8G 服务器上,是不是我放完 4 个包,啥也不用干就吃满了。
    zmal
        16
    zmal  
       2022-05-16 17:37:08 +08:00
    jvm 没这么傻,linux 也没这么傻。
    jorneyr
        17
    jorneyr  
       2022-05-16 17:50:25 +08:00
    jmap 查看哪些对象占用内存大,生成火焰图看看内存情况。
    常见的是不是使用 Map 存储了大量缓存对象。
    线上环境的 -Xms 和 -Xmx 是不是都设置为同一个值了。
    lmshl
        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 分析,无脑选内存泄漏面板就够了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1436 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 23:55 · PVG 07:55 · LAX 15:55 · JFK 18:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.