在linux下,怎么去查看一个运行中的程序, 到底是占用了多少内存
1. 在linux下,查看一个运行中的程序, 占用了多少内存, 一般的命令有
(1). ps aux:
其中 VSZ(或VSS)列 表示,程序占用了多少虚拟内存。
RSS列 表示, 程序占用了多少物理内存。
虚拟内存可以不用考虑,它并不占用实际物理内存。
#ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 19360 1528 ? Ss Jul18 0:00 /sbin/init
root 2 0.0 0.0 0 0 ? S Jul18 0:01 [kthreadd]
root 3 0.0 0.0 0 0 ? S Jul18 0:00 [migration/0]
root 4 0.0 0.0 0 0 ? S Jul18 74:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S Jul18 0:00 [migration/0]
root 6 0.0 0.0 0 0 ? S Jul18 0:09 [watchdog/0]
root 7 0.0 0.0 0 0 ? S Jul18 0:15 [migration/1]
root 8 0.0 0.0 0 0 ? S Jul18 0:00 [migration/1]
root 9 0.0 0.0 0 0 ? S Jul18 42:05 [ksoftirqd/1]
root 10 0.0 0.0 0 0 ? S Jul18 0:07 [watchdog/1]
root 11 0.0 0.0 0 0 ? S Jul18 0:02 [migration/2]
root 12 0.0 0.0 0 0 ? S Jul18 0:00 [migration/2]
root 13 0.0 0.0 0 0 ? S Jul18 18:26 [ksoftirqd/2]
root 14 0.0 0.0 0 0 ? S Jul18 0:06 [watchdog/2]
(2). top 命令也可以
其中 VIRT(或VSS)列 表示,程序占用了多少虚拟内存。 同 ps aux 中的 VSZ列
RES列 表示, 程序占用了多少物理内存。同 ps aux 中的RSS列
#top
top - 19:41:09 up 97 days, 10:44, 1 user, load average: 0.04, 0.01, 0.00
Tasks: 424 total, 1 running, 423 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni, 99.9%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 16333244k total, 5963824k used, 10369420k free, 536076k buffers
Swap: 10485752k total, 0k used, 10485752k free, 1859516k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2762 jbossuse 20 0 17.4g 3.0g 35m S 0.3 19.5 1:48.00 java
12789 root 20 0 15304 1552 972 R 0.3 0.0 0:00.03 top
1 root 20 0 19360 1528 1216 S 0.0 0.0 0:00.99 init
2 root 20 0 0 0 0 S 0.0 0.0 0:01.37 kthreadd
2.在linux下, 查看当前系统占用了多少内存, 一般的命令是 free
其中, free就是系统还有多少内存可以使用。
但由于 linux 系统对内存使用有一个原则, 就是, 内存是宝贵的, 能使用多少就使用多少。 所以, linux会把已经调用过的包缓存起来,放在内存里。
这样,实际上,可以使用的内存,就可以理解为, free+buffers+cached
3.当你了解完这些命令以后, 再去使用ps aux 命令去查看的时候, 会发现一个奇怪的现象。
所有的 RSS 列的数据,加起来, 比物理内存的数要大很多。
比如, 物理内存为2G, 而RSS列的数据加起来,可能有5个G之多, 这是怎么回事了?
这是因为RSS列的值骗了我们。
linux的内存机制是这样的:
在运行一个程序时, linux会调用该程序依赖的链接库, 如lib.xx.so。 首先看该链接库是否被映射进内存中,如果没有被映射,则将代码段与数据段映射到内存中,否则只是将其加入进程的地址空间。
这样,当N个程序,依赖到lib.xx.so的时候, 实际上,内存中只有一个lib.xx.so ,而不是N个。
而RSS在显示一个程序占用的实际物理内存时, 将lib.xx.so也算了进来。
比如, X程序, 本身占用内存为5M, lib.xx.so 占用内存2M,lib.xx.so被N个程序共享依赖。 则RSS显示为,X程序运行,占用内存为7M。 实际上, X程序占用了5M空间。 多余的2m被讨入到RSS中了。
当你在用ps aux显示内存占用情况时, N个共享依赖lib.xx.so的N个程序,都把这2m空间,算在自己的RSS中了, 这样RSS的sum值,就比实际物理内存多了。
当然, linux的内存使用机制很复杂, 不是一句两句能说清楚的。这里只是简单的说明了一下, ps aux中的RSS值, 并不能真实反映物理内存的使用情况。
4. 如果查看更详细的内存使用情况, 可用以下几种方法, 或者几种方法结合使用:
这几种方法,都需要root账户的权限
(1). pmap -d $pid
$pid 是正在运行的程序的pid
502 2762 2682 0 11:54 ? 00:01:48 /opt/wildfly/java64/jdk1.7.0_25/bin/java -D[Standalone] -server -Xms4096m -Xmx8192m -XX:MaxPermSize=512m -Djava.net.preferIPv4Stack=true -Dfile.......
(2). cat /proc/$pid/smaps
smaps的数据比较详细,可简单的归纳一下,归纳的命令如下:
cat /proc/$pid/smaps | awk '/Size|Rss|Pss|Shared|Private|Referenced|Swap/{val_name=gensub(/([a-zA-Z_]*).*/,"\\1",1,$1); list[val_name]+=$2; }END{for(val in list)print val,list[val];}'
(3). cat /proc/$pid/maps
(4). cat /proc/$pid/statm
# cat /proc/2762/statm
4569543 795414 9116 1 0 4494492 0
输出解释
第一列 size:任务虚拟地址空间大小
第二列 Resident:正在使用的物理内存大小
第三列 Shared:共享页数
第四列 Trs:程序所拥有的可执行虚拟内存大小
第五列 Lrs:被映像倒任务的虚拟内存空间的库的大小
第六列 Drs:程序数据段和用户态的栈的大小
第七列 dt:脏页数量
在linux下,怎么去查看一个运行中的程序, 到底是占用了多少内存的更多相关文章
- linux下,一个运行中的程序,究竟占用了多少内存
linux下,一个运行中的程序,究竟占用了多少内存 1. 在linux下,查看一个运行中的程序, 占用了多少内存, 一般的命令有 (1). ps aux: 其中 VSZ(或VSS)列 表示,程序占用 ...
- 在linux下,查看一个运行中的程序, 占用了多少内存
1. 在linux下,查看一个运行中的程序, 占用了多少内存, 一般的命令有 (1). ps aux: 其中 VSZ(或VSS)列 表示,程序占用了多少虚拟内存. RSS列 表示, 程序占用了多少物 ...
- WINDOWS中, 如何查看一个运行中的程序是64位还是32位的
转自:https://blog.csdn.net/dayday3923/article/details/78597453?locationNum=7&fps=1 方法一: 任务管理器法任务管理 ...
- Linux下 SpringBoot jar项目后台运行、查看、停用
运行java jar: nohup java -jar **-0.0.1-SNAPSHOT.jar & 查看进程: 采用top或者ps aux命令.一般 如果后台是springboot,jar ...
- Linux下librdkafka客户端的编译运行
Linux下librdkafka客户端的编译运行 librdkafka是一个开源的Kafka客户端C/C++实现,提供了Kafka生产者.消费者接口. 由于项目需要,我要将Kafka生产者接口封装起来 ...
- (转)Linux下设置和查看环境变量
原文地址:<Linux下设置和查看环境变量> Linux的变量种类 按变量的生存周期来划分,Linux变量可分为两类: 1. 永久的:需要修改配置文件,变量永久生效. 2. 临时的:使用e ...
- 在Linux下用netstat查看网络状态、端口状态
在Linux下用netstat查看网络状态.端口状态 在linux一般使用netstat 来查看系统端口使用情况步. netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表.实 ...
- 在Linux下,如何分析一个程序达到性能瓶颈的原因
0.在Linux下,如何分析一个程序达到性能瓶颈的原因,请分别从CPU.内存.IO.网络的角度判断是谁导致的瓶颈?注意现在的机器CPU是多核 1.用sar -n DEV 1 10 2.用iotop命令 ...
- Linux下jmap命令查看内存使用
Linux下jmap命令查看内存使用 jmap -heap 1234(1234为进程号) jmap是JDK自带的一个工具,非常小巧方便,其支持参数如下: -heap 打印heap空间的概要 ...
随机推荐
- 让js调试更简单—console
一.显示信息的命令 console.log 用于输出普通信息 console.info 用于输出提示性信息 console.error用于输出错误信息 console.warn用于输出警示信息 最常用 ...
- php+redis 学习 二 悲观锁
<?php header('content-type:text/html;chaeset=utf-8'); /** * redis实战 * * 实现悲观锁机制 * */ $timeout = 5 ...
- neo-thinsdk-cs 之 thinWallet 接入私链
neo-thinsdk-cs 之 thinWallet 接入私链 2017年底刚开始接触区块链,目前在被 NEO 折磨. 一开始被官方文档和 NEO-GUI 搞得体无完肤(尤其是传说中的 F12),也 ...
- spring,property not found on type
刚开始学spring mvc ,遇到这个报错. jsp页面 user 实体类 public class User { private String name; private int age; pri ...
- windows系统下安装node
最近项目中需要使用到vue框架来实现前后端分离,于是抽时间看了下vue的相关只是,从官网了解到可以使用命令行工具(CLI)来构建应用,于是在本地环境预练了一下 下面这句话摘抄自vue文档: Vue.j ...
- javaWeb页面实现下载
jsp页面发送请求,后台实现指定路径下的文件,在浏览器上完成下载功能.@RequestMapping(value = "downloadFile")public void down ...
- Hibernate学习(一)创建数据表
(1)生成数据库表的创建: // 默认读取hibernate.cfg.xml文件 Configuration cfg = new Configuration().configure(); // 生成并 ...
- java11 - GUI图形用户界面编程
一.JavaSwing界面设计参考教程 二.布局管理器 三.绝对布局 import java.awt.Color; import java.awt.event.ActionEvent; import ...
- FIO性能测试
FIO参数中,ioengine使用libaio,并发jobs数固定为1,通过iodepth来控制压力.分别测试随机读.随机写,作为读写的性能基准.不测试顺序读写,不测试混合读写. 1.测试IOPS峰值 ...
- python_crawler,批量下载文件
这个第一个python3网络爬虫,参考书籍是<python网络数据采集>.该爬虫的主要功能是爬取某个网站,并将.rar,.doc,.docx,.zip文件批量下载. 后期将要改进的是,用后 ...