linxu下proc是个很重要的文件系统,很多和内核相关的信息都存在这里.
伦理片 http://www.dotdy.com/
maps
- 40000000-40009000 r-xp 00000000 ca:01 12550177 /opt/java/jdk-1.6.0_32/bin/java
- 40108000-4010a000 rwxp 00008000 ca:01 12550177 /opt/java/jdk-1.6.0_32/bin/java
- // 以上是进程的启动命令
- ...
- // 这里开始是分配给这个线程堆区的物理地址开始位置,包含了每个加载的文件的起始地址
- 40bbf000-40c24000 rwxp 00000000 00:00 0 [heap]
- 40c24000-40c27000 ---p 00000000 00:00 0
- ...
- d0000000-100000000 rwxp 00000000 00:00 0
- 3671800000-367181c000 r-xp 00000000 ca:01 2261321 /lib64/ld-2.5.so
- 3671a1c000-3671a1d000 r-xp 0001c000 ca:01 2261321 /lib64/ld-2.5.so
- 3671a1d000-3671a1e000 rwxp 0001d000 ca:01 2261321 /lib64/ld-2.5.so
- 7f07c04ec000-7f07c1bb7000 rwxp 00000000 00:00 0
- 7f07c1bb7000-7f07c1bbc000 r-xp 00000000 ca:01 12551958 /opt/java/jdk-1.6.0_32/jre/lib/amd64/headless/libmawt.so
- 7f07c1bbc000-7f07c1cbb000 ---p 00005000 ca:01 12551958 /opt/java/jdk-1.6.0_32/jre/lib/amd64/headless/libmawt.so
- 7f07c1cbb000-7f07c1cbd000 rwxp 00004000 ca:01 12551958 /opt/java/jdk-1.6.0_32/jre/lib/amd64/headless/libmawt.so
- 7f07c1cbd000-7f07c1d4f000 r-xp 00000000 ca:01 12551964 /opt/java/jdk-1.6.0_32/jre/lib/amd64/libawt.so
- 7f07c1d4f000-7f07c1e4e000 ---p 00092000 ca:01 12551964 /opt/java/jdk-1.6.0_32/jre/lib/amd64/libawt.so
- 7f07c1e4e000-7f07c1e68000 rwxp 00091000 ca:01 12551964 /opt/java/jdk-1.6.0_32/jre/lib/amd64/libawt.so
- ...
- 7f07e0bb4000-7f07e0bbc000 rwxs 00000000 ca:01 16678915 /tmp/hsperfdata_admin/22892
- 7f07e0bbc000-7f07e0bc3000 r-xs 00000000 ca:01 4981946 /usr/lib64/gconv/gconv-modules.cache
- 7f07e0bc3000-7f07e0bc4000 rwxp 00000000 00:00 0
- 7f07e0bc4000-7f07e0bc5000 r-xp 00000000 00:00 0
- 7f07e0bc5000-7f07e0bc6000 r-xp 00000000 ca:01 5996807 /usr/local/snoopy/lib/snoopy.so
- 7f07e0bc6000-7f07e0dc6000 ---p 00001000 ca:01 5996807 /usr/local/snoopy/lib/snoopy.so
- 7f07e0dc6000-7f07e0dc7000 rwxp 00001000 ca:01 5996807 /usr/local/snoopy/lib/snoopy.so
- 7f07e0dc7000-7f07e0dca000 rwxp 00000000 00:00 0
- 7fff73ffc000-7fff74016000 rwxp 00000000 00:00 0 [stack] // 用户态栈区
- 7fff74098000-7fff74099000 r-xp 00000000 00:00 0 [vdso] // Virtual Dynamically-linked Shared Object
- ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] // 内核区
maps记录的是进程的简单信息,可以看堆区是不是在一直增长来判断是不是内存溢出。jvm的内存是虚拟内存,直接映射到os的物理内存中。有时候jvm中的虚拟内存是没什么问题,但是堆外内存一直在增长,这里是可以看出来的。详细内容见smaps
smaps
- 40bbf000-40c24000 rwxp 00000000 00:00 0 [heap]
- Size: 404 kB // 虚拟内存大小
- Rss: 324 kB // 实际使用物理内存大小
- Pss: 324 kB
- Shared_Clean: 0 kB // 页面被改,则是dirty,否则是clean,页面引用计数>1,是shared,否则是private
- Shared_Dirty: 0 kB
- Private_Clean: 0 kB
- Private_Dirty: 324 kB
- Referenced: 324 kB
- Anonymous: 324 kB
- AnonHugePages: 0 kB
- Swap: 0 kB // 处于交换区的页面大小
- KernelPageSize: 4 kB // 操作系统一个页面大小
- MMUPageSize: 4 kB // 体系结构MMU一个页面大小
status
- Name: java // 启动命令
- State: S (sleeping) // 任务状态,运行/睡眠/僵死
- Tgid: 22892 // 线程组号
- Pid: 22892 // 进程id
- PPid: 22881 // 父进程id
- TracerPid: 0
- Uid: 505 505 505 505
- Gid: 505 505 505 505
- Utrace: 0
- FDSize: 1024
- Groups: 505
- VmPeak: 1757412 kB // 内存使用峰值
- VmSize: 1756360 kB // 进程虚拟地址空间大小
- VmLck: 0 kB // 进程锁住的物理内存大小,锁住的物理内存无法交换到硬盘
- VmHWM: 817696 kB
- VmRSS: 817688 kB // 进程正在使用的物理内存大小
- VmData: 1578852 kB // 进程数据段大小
- VmStk: 108 kB // 进程用户态栈大小
- VmExe: 36 kB // 进程代码段大小
- VmLib: 100032 kB // 进程使用的库映射到虚拟内存空间的大小
- VmPTE: 2176 kB // 进程页表大小
- VmSwap: 0 kB // 交换区
- Threads: 162
- SigQ: 0/31611
- SigPnd: 0000000000000000
- ShdPnd: 0000000000000000
- SigBlk: 0000000000000000
- SigIgn: 0000000000002223
- SigCgt: 1000000181005ccc
- CapInh: 0000000000000000
- CapPrm: 0000000000000000
- CapEff: 0000000000000000
- CapBnd: ffffffffffffffff
- Cpus_allowed: 7fff
- Cpus_allowed_list: 0-14
- Mems_allowed: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
- Mems_allowed_list: 0
- voluntary_ctxt_switches: 1
- nonvoluntary_ctxt_switches: 6
linux下内存占用是一个比较复杂的概念,不能简单通过一个单一指标就判断某个程序“内存消耗”大小:
- 进程所申请的内存不一定真正会被用到(malloc或mmap的实现)
- 真正用到了的内存也不一定是只有该进程自己在用 (比如动态共享库)