1. pmap 命令

pmap 命令可以查看进程的内存映像信息,其输出内容来自于 /proc/<pid>/maps /proc/<pid>/smaps 这两个文件, maps 文件包含了每一段内存的大概描述, smaps 里包含了具体每段的详细信息

1.1 使用方式

在 Linux 系统中使用 man pmap 可查看其帮助文档,这个命令的格式为 pmap [options] pid ,其中 options 选项如下表:

Options 功能
-x, --extended 显示扩展格式
-d, --device 显示设备格式
-q, --quiet 不显示头尾行
-A, --range low,high 显示给定地址范围的结果,参数以逗号分隔
-X 显示比 -x 选项更详细的信息, 信息来自文件 /proc/PID/smaps
-XX 显示 kernel能提供的一切信息
-c, --read-rc 读取默认配置
-V, --version 显示版本信息

1.2 示例

pmap -x 7642 命令打印进程 7642 的内存信息,其中 扩展格式和设备格式字段含义如下

字段 含义
Address 映像起始地址
Kbytes 映像大小
RSS 驻留集大小
Dirty 脏页大小
Mode 映像权限
Mapping 映像支持文件,[anon]为已分配内存[stack]为程序堆栈
Offset 文件偏移
Device 设备名
// 进程启动命令
7642:   java -Xmx256m -server -XX:+PrintGCApplicationStoppedTime -jar bin/center.jar 
Address           Kbytes     RSS   Dirty Mode  Mapping
0000000000400000       4       0       0 r-x-- java
0000000000600000       4       4       4 rw--- java
00000000018dc000    1208    1092    1092 rw---   [ anon ]
00000000f0000000  257536  134672  134672 rw---   [ anon ]
00000000ffb80000    4608       0       0 -----   [ anon ]
0000000100000000   12080   12052   12052 rw---   [ anon ]
0000000100bcc000 1036496       0       0 -----   [ anon ]
00007f53dda8d000     256      60      60 rw---   [ anon ]
......

2. gdb 调试工具

使用 gdb 工具可以 dump 指定地址范围的内存,该操作会影响服务,需注意dump的内存块大小,慎用。以下命令的含义是dump 指定进程 13618 起始地址为0x7ffc0508b000,结束地址为 0x7ffc0508b000 加上偏移量 132000 的内存,并将其保存到 199.dump 文件中

gdb --batch --pid 13618 -ex "dump memory 199.dump 0x7ffc0508b000 0x7ffc0508b000+132000"

内存起始地址可以使用 pmap 命令查看,Address字段即为内存地址,但是要注意需要将地址高位的 0 换成0x开头,比如 dump 以上 0000000000400000 开始,0000000000600000 结束的内存,需要转化成 0x400000 0x600000 或者使用偏移量方式 0x400000 0x400000+4000

dump 出来的文件其实是二进制形式的,直接查看就是一堆乱码,可以使用 strings -n 10 199.dump 查看 10 个字符以上的内存内容

  • 其实即便到这一步也很难看出来有用的信息,后续可以借助 perf工具继续排查。使用 perf record -g -p <pid> 开启监控栈函数调用,运行一段时间后 Ctrl+C 结束,会生成一个文件perf.data,执行perf report -i perf.data查看报告
(1)通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源。在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。 (2)线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文。多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定。线程的运行中需要使用计算机的内存资源和CPU。 (3)进程间相互独立,同一进程的各线程间 一、什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。 特别提醒:共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前,并无自动机制可以阻止第二个进程开始对它进行读取。所以我们通常需要用其他的机 (1)ps -p {pid} -T 可以得到该进程里面运行的各线程的id(表现出来是spid)、对应的线程名称(不超过16字符)、运行时间等;你可以把这个目录下的信息理解为Linux内核在执行你写的程序时所打印的Log。下,因此你可以通过查看这个目录下的信息来或者进程的运行时行为,这对于那些好奇内核是如何运行程序的同学是非常重要的。下记录了每个进程运行时的所有关键信息,那这些信息是谁来生成的呢,答案是Linux内核。Linux内核在执行你写的程序时,将所有关键信息写到了。   内核把物理页作为内存管理的基本单位,尽管处理器的小可寻址单位通常为字节,但是MMU(内存管理单元,管理内存并把虚拟地址转换为物理地址的硬件)通常以页作为单位进行处理。大多数32位体系结构支持4KB的页,内核用struct page结构表示系统的物理页,这个page与物理页相关,而并非与虚拟页相关。页的拥有者可能是用户空间进程、动态分配的内核数据、静态内核代码或页高速缓存等。   由于有些页位于内存特定的物理地址上,所以不能将其用于一些特定的任务。故内核把页分成不同的区,分别是ZONE_DMA、ZONE_DMA32、ZONE_NORMAL和ZONE_HIGHMEM(高 Linux下提供了多种共享内存的通讯机制,常用的就是socket,但是socket通讯使用简单,但性能不佳,最优的方式还是共享内存方式。本章分享封装库,的就是基于共享内存实现的。 本分享库是基于Ubuntu16.04编译的,如需其它平台编译库可以发邮件至:512146329@qq.com 设计的要求: 1:使用进程间的互斥锁,实现了共享内存共享数据的互斥访问问题 2:有效数据部分,通过分配器来管理内存的开辟和释放 3:实现了一对多的模型(一端发送,多端接收的模型) 在多任务操作系统中,每个进程都运行在属于自己的内存沙盘中。这个沙盘就是虚拟地址空间(Virtual Address Space),在32位模式下它是一个4GB的内存地址块。在Linux系统中, 内核进程和用户进程所占的虚拟内存比例是1:3,而Windows系统为2:2(通过设置Large-Address-Aware Executables标志也可为1:3)。这并不意味着内... 点击上方“民工哥技术之路”,选择“设为星标”回复“1024”获取独家整理的学习资料!线上故障主要会包括cpu、磁盘、内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排... 先查看自己的电脑能不能装内存条,该装什么型号的内存条,这是必要的: 打开任务管理器------>选择性能------>选择内存------>查看已使用卡槽和速度 如图所示,我的卡槽已经装满了,就不能再装内存条了,内存条也分型号,速度就是判断依据 判断电脑最大能装多少G win+R ------> 输入cmd------>输入wmic memphysical get maxcapacit Linux查看某一个进程所占用的内存,首先可以通过ps命令找到进程id,比如 ps -ef | grep kafka 可以看到kafka这个程序的进程id。第一个标注的地方是CPU和内存占用率,后面的943100是物理内存使用量,单位是k,此时kafka大约占用943M内存。通过: ps aux | sort -k4,4nr | head -n 10 查看内存占用前10名的程序。这样可以动态实时的看到CPU和内存的占用率,然后按q键回到命令行。另外还可以通过 top 命令动态查看内存占用。... The pmap command reports the memory map of a process or processes. pmap 提供了进程内存映射,用于显示一个或多个进程内存状态,报告进程的地址空间和内存状态信息。