• Java内存占用排查的方法


    htop:查进程的内存占用

    $ htop
    

    find-java-process-by-htop

    相关名词:

    VIRTvirtual memory usage 虚拟内存

    • 进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等
    • 假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量

    RESresident memory usage 常驻内存

    • 进程当前使用的内存大小,但不包括swap out
    • 包含其他进程的共享
    • 如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反
    • 关于库占用内存的情况,它只统计加载的库文件所占内存大小

    SHRshared memory 共享内存

    • 除了自身进程的共享内存,也包括其他进程的共享内存
    • 虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小
    • 计算某个进程所占的物理内存大小公式:RES – SHR
    • swap out后,它将会降下来

    pmap:查进程的内存分布

    先使用htop找到java进程的进程id,然后:

    pmap -x 30420
    

    上面的命令的输出结果没法进行排序找出较大的内存块,建议导出成文件,下载到自己本机分析。我自己的做法是在自己本机使用IDEA打开,然后利用多行编辑功能在每一列添加英文逗号“,”,因为这样能都对RSS(Resident Set Size)列排序,具体操作如下:

    RSS 是常驻内存集(Resident Set Size),表示该进程分配的内存大小

    导出:

    # 在服务器上导出
    pmap -x 30420 > pmap30420.csv
    
    # 利用lszrz下载
    sz -be pmap30420.csv
    

    然后vscode(不要用IDEA,很卡。行数多的时候vscode没那么卡)打开,利用多行编辑(快捷键alt + shift + up/down)加英文逗号:

    pmap-csv

    然后就可以用Excel打开,对第三列RSS倒序排序找出可疑的(占用多的)是哪些内存块:

    pmap-excel

    NMT:查JVM内存

    注意:NMT是用来看Java进程中JVM部分的内存情况,并非整个Java进程的内存情况

    java -XX:NativeMemoryTracking=[detail|summary]
    
    # 例如:
    java -Xms500M -Xmx1500M -XX:NativeMemoryTracking=detail -jar ewulian-server.jar
    

    然后使用jcmd

    # 加detail是看详情
    jcmd PID VM.native_memory [detail]
    

    例如:

    $ jcmd 30420 VM.native_memory > jcmd30420-summary.txt
    $ cat jcmd30420-summary.txt
    30420:
    
    Native Memory Tracking:
    
    Total: reserved=3201582KB, committed=991846KB
    -                 Java Heap (reserved=1536000KB, committed=565760KB)
                                (mmap: reserved=1536000KB, committed=565760KB) 
     
    -                     Class (reserved=1141993KB, committed=104385KB)
                                (classes #15022)
                                (malloc=7401KB #29512) 
                                (mmap: reserved=1134592KB, committed=96984KB) 
     
    -                    Thread (reserved=77490KB, committed=77490KB)
                                (thread #76)
                                (stack: reserved=77060KB, committed=77060KB)
                                (malloc=246KB #381) 
                                (arena=184KB #147)
     
    -                      Code (reserved=260241KB, committed=61473KB)
                                (malloc=10641KB #14504) 
                                (mmap: reserved=249600KB, committed=50832KB) 
     
    -                        GC (reserved=61908KB, committed=58788KB)
                                (malloc=5784KB #490) 
                                (mmap: reserved=56124KB, committed=53004KB) 
     
    -                  Compiler (reserved=365KB, committed=365KB)
                                (malloc=235KB #1216) 
                                (arena=131KB #6)
     
    -                  Internal (reserved=98440KB, committed=98440KB)
                                (malloc=98408KB #21205) 
                                (mmap: reserved=32KB, committed=32KB) 
     
    -                    Symbol (reserved=20667KB, committed=20667KB)
                                (malloc=17590KB #178837) 
                                (arena=3077KB #1)
     
    -    Native Memory Tracking (reserved=4353KB, committed=4353KB)
                                (malloc=412KB #5868) 
                                (tracking overhead=3942KB)
     
    -               Arena Chunk (reserved=125KB, committed=125KB)
                                (malloc=125KB) 
    

    jcmd还有其它功能,比如查看Java进程的堆直方图

    查看java进程的堆直方图

    $ jcmd 30420 GC.class_histogram | less
    

    说明:

    • GC.class_histogram:输出的仅包含活跃对象
    • [C:字符数组
    • [B:字节数组
    • [Ljava.lang.Object:Object数组

    jcmd的其它功能可以通过help查看:

    $ jcmd 30420 help
    30420:
    The following commands are available:
    JFR.stop
    JFR.start
    JFR.dump
    JFR.check
    VM.native_memory
    VM.check_commercial_features
    VM.unlock_commercial_features
    ManagementAgent.stop
    ManagementAgent.start_local
    ManagementAgent.start
    VM.classloader_stats
    GC.rotate_log
    Thread.print
    GC.class_stats
    GC.class_histogram
    GC.heap_dump
    GC.finalizer_info
    GC.heap_info
    GC.run_finalization
    GC.run
    VM.uptime
    VM.dynlibs
    VM.flags
    VM.system_properties
    VM.command_line
    VM.version
    help
    
  • 相关阅读:
    FT View SE联合Studio 5000仿真
    安装AB编程软件提示安装失败时如何处理
    如何识别Studio 5000程序开发版本号
    Studio 5000编程:一种累计时间的编程方法
    CPU或以太网模块重启DHCP请求
    Studio 5000编程:如何判断AB PLC系统中的硬件设备是否在正常工作
    使用以太网通信方式刷新AB PLC固件
    初探Node-red结合阿里云数据库,定时显示数据
    SQL SERVER 按时间计算每天某值的平均值
    微信小程序对接显示阿里云数据库数据
  • 原文地址:https://www.cnblogs.com/caibh/p/13785342.html
Copyright © 2020-2023  润新知