倒排序方式显示Java进程内存占用

博主分享了一个自编的Shell脚本`showMemory.sh`,用于在Ubuntu系统中以倒序方式直观展示Java进程的内存占用情况。通过`jps`和`awk`等命令获取进程信息,然后利用`bc`进行内存大小转换,最终通过`sort`排序显示,使得监控Java内存变得更加便捷。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

平时经常要调试查看java 进程内存占用情况,手动的方式,
top
ps aux
之类的命令不是很直观
于是写了个工具直观的按照倒排序方式显示java进程内存占用情况。

ubuntu@ubuntu:/var/server/software$ cat showMemory.sh
#!/usr/bin/env bash

procIdList=$(jps -l | awk '{ print $1 }')
info="";
for id in $procIdList
     do
	     procName=$(jps -l | grep $id | awk '{ print $2 }')
	     if [ -f /proc/$id/status ]; then
	        memSizeInKB=$(cat /proc/$id/status | grep VmRSS  |  awk '{ print $2 }')
	        #memSizeInMB=`expr $memSizeInKB / 1024 `
	        memSizeInMB=`echo "scale=3; $memSizeInKB / 1024" | bc `
	        info="${info}\n进程id: ${id} 进程名: ${procName} 内存 ${memSizeInMB} MB"
             fi
     done
     echo -e $info | sort -n -r -k 6

在这里插入图片描述
这样一目了然,指定当前设备的Java内存占用情况。

方便发现问题。

<think>我们被要求查看内存占用最高的十个进程。在之前的回答中,我们已经提到过使用`ps`命令按内存排序的方法。这里我们直接使用该命令,并调整输出格式以便清晰显示。 命令:`ps aux --sort=-%mem | head -n 11` 或者 `ps -eo pid,user,%mem,%cpu,comm --sort=-%mem | head -n 11` 解释: - `ps aux`:显示所有进程的详细信息。 - `--sort=-%mem`:按内存使用百分比降序排序(-表示降序)。 - `head -n 11`:显示前11行(因为第一行是标题行,后面10行是进程)。 但注意:`ps aux`输出的列中,%MEM是内存百分比,RSS是实际物理内存(以KB为单位),但默认输出没有RSS列。如果我们想显示RSS,可以指定输出列。 另一种方法是使用`ps`命令自定义输出格式,并显示内存占用(RSS)的绝对值。由于用户要求的是“内存占用”,我们可以选择显示RSS(单位通常是KB)或者%MEM(百分比)。这里我们同时显示两者,以便用户全面了解。 因此,我们可以使用以下命令: ```bash ps -eo pid,user,%mem,rss,comm --sort=-%mem | head -n 11 ``` 或者为了可读性,将RSS转换为MB: ```bash ps -eo pid,user,%mem,rss,comm --sort=-%mem | awk 'NR==1; NR>1 {$4=int($4/1024)"MB"; print}' | head -n 11 ``` 但是,使用awk会改变输出格式,可能导致列不对齐。因此,我们可以先输出原始数据,然后建议用户如果希望以MB显示,可以使用以下命令: ```bash ps -eo pid,user,%mem,rss,comm --sort=-%mem | head -n 11 | awk 'NR==1 {print} NR>1 {$4=sprintf("%.1fMB", $4/1024); print}' ``` 不过,为了简单起见,我们直接使用`ps`命令,并告诉用户RSS的单位是KB,如果需要转换可以自行处理。 另外,我们也可以使用`top`或`htop`工具,但用户要求的是“查看内存占用最多的十个进程”,所以使用`ps`命令并排序后取前10是最直接的。 步骤: 1. 打开终端。 2. 输入命令(选择一种): a. 显示内存百分比和RSS(KB): ```bash ps -eo pid,user,%mem,rss,comm --sort=-%mem | head -n 11 ``` b. 显示内存百分比和RSS(MB): ```bash ps -eo pid,user,%mem,rss,comm --sort=-%mem | awk 'BEGIN {print "PID USER %MEM RSS COMM"} NR>1 {rss_mb=$4/1024; printf "%s %s %s %.1fMB %s\n", $1, $2, $3, rss_mb, $5}' | head -n 11 ``` 注意:第二种方法通过awk将RSS从KB转换为MB,并保留一位小数。 但是,由于`ps`命令的输出可能因系统不同而略有差异,我们也可以使用`--no-headers`来去掉标题,然后自己添加标题,但这样会复杂一些。这里我们采用第一种简单方式,并告诉用户RSS的单位。 另外,我们也可以使用`pmap`工具来查看某个进程的详细内存映射,但这里只需要前10个进程,所以不需要。 因此,我们推荐使用第一种命令,并解释输出: 示例输出: ``` PID USER %MEM RSS COMM 12345 mysql 10.2 1023444 mysqld 67890 apache 5.1 512344 httpd ...(共10行)... ``` 解释: - `PID`:进程ID。 - `USER`:进程所有者。 - `%MEM`:内存使用百分比(基于总物理内存)。 - `RSS`:实际物理内存占用(单位是KB)。 - `COMM`:命令名。 如果用户觉得RSS以KB显示不直观,可以自行换算(1MB=1024KB)。 另外,我们也可以使用`top`命令,然后按`Shift+M`(大写M)按内存排序,然后查看最上面的10个进程。但这是交互式的,而用户可能只需要一个一次性命令。 因此,我们给出两种方案: 方案一:使用`ps`命令(非交互式,适合脚本) 方案二:使用`top`命令(交互式,动态更新) 根据用户需求,这里我们重点给出非交互式的`ps`命令。 命令: ```bash echo "查看内存占用最高的10个进程:" ps -eo pid,user,%mem,rss,comm --sort=-%mem | head -n 11 ``` 或者,如果系统支持`pcpu`(按CPU排序)和`pmem`(按内存排序),我们可以直接使用`pmem`作为排序字段,但`--sort`已经可以处理。 注意:如果进程数不足10个,`head`会显示所有进程。 为了确保正确性,我们也可以使用: ```bash ps -eo pid,user,%mem,rss,comm --sort=-rss | head -n 11 ``` 因为按RSS绝对值排序可能更符合“内存占用”的直观理解(而不是百分比)。用户可以根据需要选择按%mem排序还是按rss排序。 所以,我们提供两种排序方式: 1. 按内存百分比排序(%mem): ```bash ps -eo pid,user,%mem,rss,comm --sort=-%mem | head -n 11 ``` 2. 按物理内存大小排序(rss): ```bash ps -eo pid,user,%mem,rss,comm --sort=-rss | head -n 11 ``` 通常,按RSS绝对值排序更直接反映内存占用大小,因此推荐第二种。 最终命令: ```bash ps -eo pid,user,%mem,rss,comm --sort=-rss | head -n 11 ``` 输出示例: ``` PID USER %MEM RSS COMM 12345 mysql 10.2 1023444 mysqld 67890 apache 5.1 512344 httpd ...(下面9行)... ``` 相关问题: 1. 如何查看Linux服务器上总的物理内存? 2. 如何监控某个进程内存使用变化? 3. 如何查看进程的详细内存映射信息? 4. 如何找出内存泄漏的进程? 注意:在引用中,我们之前提到过使用`ps aux --sort=-%mem | head -10`,但这里我们改进了输出,并增加了按RSS排序的选项。 引用:在之前的回答中,我们提到“`ps aux --sort=-%mem | head -10`”[^1]。</think>在Linux服务器上查看内存占用最高的十个进程,可以使用以下命令(按物理内存占用降序排列): ### 推荐命令: ```bash ps -eo pid,user,%mem,rss,comm --sort=-rss | head -n 11 ``` **输出示例**: ``` PID USER %MEM RSS COMM 1234 mysql 15.2 2456M mysqld 5678 java 12.1 1950M java 9012 nginx 8.3 1340M nginx ...(省略其他7行)... ``` ### 命令解析: 1. **`ps -eo`**:自定义输出列 - `pid`:进程ID - `user`:进程所有者 - `%mem`:内存使用百分比 - `rss`:实际物理内存占用(单位KB) - `comm`:进程名 2. **`--sort=-rss`**:按RSS降序排序 (`-`表示降序,`+`表示升序) 3. **`head -n 11`**:显示前11行 (第1行为标题行 + 前10进程) ### 其他等效方案: 1. **按内存百分比排序**: ```bash ps -eo pid,user,%mem,comm --sort=-%mem | head -n 11 ``` 2. **显示完整命令路径**: ```bash ps -eo pid,user,%mem,rss,cmd --sort=-rss | head -n 11 ``` 3. **交互式查看(推荐)**: ```bash top # 进入后按 Shift+M 按内存排序 ``` ### 关键概念: - **RSS (Resident Set Size)**:进程实际占用的物理内存(不含Swap)[^1] - **%MEM**:`RSS / 总物理内存`的百分比[^2] - **VSZ (Virtual Memory Size)**:含虚拟内存的总占用(通常不反映真实内存压力) > **提示**:若发现异常进程,可用`pmap -x <PID>`分析其详细内存分布[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开心自由天使

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值