linux查看进程内存占用

发布时间:2020-03-09 09:59:12编辑:admin阅读(2655)

    一、概述

    需要知道一台机器上面跑的java程序,各占用了多少内存。

     

    二、查看

    ps -aux | grep xxx

    USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

    可以看到RSS,也就是物理内存占用,单位是KB。RSS是常驻内存集(Resident Set Size),表示该进程分配的内存大小。RSS不包括进入交换分区的内存。RSS包括共享库占用的内存(只要共享库在内存中)RSS包括所有分配的栈内存和堆内存。

     

    输出如下:

    root    4544  7.9  8.6 3141048 705316 ?      Sl   14:49   2:37 java -Djava.rmi.server.hostname=192.168.31.150 -Dcom.sun.management.jmxremote.port=12002 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.userenticate=false -Xms512m -Xmx512m -XX:MetaspaceSize=50M -XX:MaxMetaspaceSize=256m -jar /data/tomcat_test_service_user/service-user.jar
    root      4870  0.0  0.0 103320   888 pts/0    S+   15:22   0:00 grep java
    root    6072  0.1  8.5 3141104 697052 ?      Sl   Jul18 188:59 java -Djava.rmi.server.hostname=192.168.31.150 -Dcom.sun.management.jmxremote.port=12004 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.meetingenticate=false -Xms512m -Xmx512m -XX:MetaspaceSize=50M -XX:MaxMetaspaceSize=256m -jar /data/tomcat_test_service_meeting/service-meeting.jar
    root     11257  0.0  6.5 3105424 537836 ?      Sl   Oct21  28:06 java -Djava.rmi.server.hostname=192.168.31.150 -Dcom.sun.management.jmxremote.port=12001 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Xms512m -Xmx512m -XX:MetaspaceSize=50M -XX:MaxMetaspaceSize=256m -jar /data/code/test-config-server_8762/config-server.jar
    root   17346  0.0  6.0 3132864 499504 ?      Sl   Oct21  41:46 java -Djava.rmi.server.hostname=192.168.31.150 -Dcom.sun.management.jmxremote.port=12000 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Xms512m -Xmx512m -XX:MetaspaceSize=50M -XX:MaxMetaspaceSize=256m -jar /data/tomcat_test_eureka_server/eureka-server.jar
    root   18127  0.4  7.7 3153628 632068 ?      Sl   Oct21 209:39 java -Djava.rmi.server.hostname=192.168.31.150 -Dcom.sun.management.jmxremote.port=12005 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.gatewayenticate=false -Xms512m -Xmx512m -XX:MetaspaceSize=50M -XX:MaxMetaspaceSize=256m -jar /data/tomcat_test_gateway_server/gateway-server.jar
    root   28033  0.2  7.2 3165680 591664 ?      Sl   Oct12 134:32 java -Djava.rmi.server.hostname=192.168.31.150 -Dcom.sun.management.jmxremote.port=12003 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Xms512m -Xmx512m -XX:MetaspaceSize=50M -XX:MaxMetaspaceSize=256m -jar /data/tomcat_test_auth_server/auth-server.jar

     

    RSS单位是KB,要转换为具体的MB,怎么做呢?

     

    三、单位转换

    先来看一个例子,假设有一个进程,RSS值为:103320

    #!/usr/bin/env python3
    # coding: utf-8
    
    import math
    
    def convertBytes(bytes, lst=None):
        if lst is None:
            lst=['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB']
        i = int(math.floor( # 舍弃小数点,取小
                 math.log(bytes, 1024) # 求对数(对数:若 a**b = N 则 b 叫做以 a 为底 N 的对数)
                ))
    
        if i >= len(lst):
            i = len(lst) - 1
        return ('%.2f' + " " + lst[i]) % (bytes/math.pow(1024, i))
    
    if __name__ == '__main__':
        RSS = 103320
        print(convertBytes(int(RSS)*1024))

     执行输出:

    100.90 MB

    注意:因为它是KB,转换为bytes,需要*1024

     

    三、批量转换

    将 ps -aux | grep java 命令的输出结果,写入到一个文件 pro.txt

     

    新建一个 test.py文件,内容如下:

    #!/usr/bin/env python3
    # coding: utf-8
    
    import math
    
    def convertBytes(bytes, lst=None):
        if lst is None:
            lst=['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB']
        i = int(math.floor( # 舍弃小数点,取小
                 math.log(bytes, 1024) # 求对数(对数:若 a**b = N 则 b 叫做以 a 为底 N 的对数)
                ))
    
        if i >= len(lst):
            i = len(lst) - 1
        return ('%.2f' + " " + lst[i]) % (bytes/math.pow(1024, i))
    
    if __name__ == '__main__':
        with open('pro.txt',encoding='utf-8') as f:
            for i in f:
                i = i.strip()
                cut_row = i.split()
                # print(cut_row)
                USER = cut_row[0]
                PID = cut_row[1]
                CPU  = cut_row[2]
                MEM = cut_row[3]
                VSZ = cut_row[4]
                RSS = cut_row[5]
                TTY = cut_row[6]
                STAT = cut_row[7]
                START = cut_row[8]
                TIME = cut_row[9]
                COMMAND = cut_row[10]
                JAR_NAME = cut_row[-1]
                if JAR_NAME != 'java':
                    # print(RSS)
                    print(JAR_NAME,'    ',convertBytes(int(RSS)*1024))

     

    执行输出:

    /data/tomcat_test_service_user/service-user.jar      688.79 MB
    /data/tomcat_test_service_meeting/service-meeting.jar      680.71 MB
    /data/code/test-config-server_8762/config-server.jar      525.23 MB
    /data/tomcat_test_eureka_server/eureka-server.jar      487.80 MB
    /data/tomcat_test_gateway_server/gateway-server.jar      617.25 MB
    /data/tomcat_test_auth_server/auth-server.jar      577.80 MB

     

     将结果,直接复制到excel文件中。

    1.png

     

     如果需要统计,去掉MB单位后,就可以做一下SUM计算了。

     

    本文参考链接:

    https://www.cnblogs.com/linyx/p/9766193.html


关键字