linux ps vsz malloc,Linux proc 内存

ps:html

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

root          4238     0.0        0.0     52396  352   pts/0    S       21:29    0:00   ./prog

VSZ指的是进程内存空间的大小,这里是52396KB;

RSS指的是驻留物理内存中的内存大小,这里是352KB。

通常系统管理员知道VSZ并不表明进程真正用到的内存,由于有些空间会仅在页表中挂个名,也就是说只是虚拟存在着,只有真正用到的时候内核才会把虚拟页面和真正的物理页面映射起来。好比,prog.c中用malloc()分配的32MB内存,因为程序中并无用到这些内存,没有物理内存被分配,也就不该算到进程的账上。node

进程的内存使用状况比较复杂,这是由于:linux

进程所申请的内存不必定真正会被用到

真正用到了的内存也不必定是只有该进程本身在用 (好比动态共享库)

有效的实际使用内存 = 该进程独占的内存 + 共享的内存A /共享A的进程数目 + 共享的内存B /共享B的进程数目 + ... 缓存

free -m

total(96679)表示系统中物理内存总量。

used(1631)表示已经分配的物理内存。

free(95048)表示还没有分配的物理内存。

shared(0)表示共享内存。

buffers(196)表示分配给用做buffer的内存。

cached(283)表示分配给用做cached的内存。

第二行:

-buffers/cache(1151): 第一行中的used - buffers - cached

+buffer/cache(95528): 第一行中的free + buffers + cached

说明:数据会有些许的偏差,猜想是四舍五入引发的。

-buffers/cache能够表示被进程实实在在消耗掉的内存。

+buffers/cache能够表示还能够分配的内存大小。由于buffers/cache还能够被压缩。

buffers和cache的区别:

A buffer is something that has yet to be “written” to disk. A cache is something that has been “read” from the disk and stored for later use.

第三行:

交换区。当内存不够用的时候,系统会选择合适的进程,将其交换到swap区,把它占用的内存从新分配给其余进程。第三行表示swap区的大小和已经被使用掉的空间。数据结构

mapsapp

Each row in /proc/$PID/maps describes a region of contiguous virtual memory in a process or thread. Each row has the following fields:this

address perms offset dev inode pathname

08048000-08056000 r-xp 00000000 03:0c 64593 /usr/sbin/gpm

address - This is the starting and ending address of the region in the process's address space

permissions - This describes how pages in the region can be accessed. There are four different permissions: read, write, execute, and shared. If read/write/execute are disabled, a '-' will appear instead of the 'r'/'w'/'x'. If a region is not shared, it is private, so a 'p' will appear instead of an 's'. If the process attempts to access memory in a way that is not permitted, a segmentation fault is generated. Permissions can be changed using the mprotect system call.

offset - If the region was mapped from a file (using mmap), this is the offset in the file where the mapping begins. If the memory was not mapped from a file, it's just 0.

device - If the region was mapped from a file, this is the major and minor device number (in hex) where the file lives.

inode - If the region was mapped from a file, this is the file number.

pathname - If the region was mapped from a file, this is the name of the file. This field is blank for anonymous mapped regions. There are also special regions with names like [heap], [stack], or [vdso]. [vdso] stands for virtual dynamic shared object. It's used by system calls to switch to kernel mode. Here's a good article about it.

You might notice a lot of anonymous regions. These are usually created by mmap but are not attached to any file. They are used for a lot of miscellaneous things like shared memory or buffers not allocated on the heap. For instance, I think the pthread library uses anonymous mapped regions as stacks for new threadsspa

The format of the file is:

address perms offset dev inode pathname

00400000-00452000 r-xp 00000000 08:02 173521 /usr/bin/dbus-daemon

00651000-00652000 r--p 00051000 08:02 173521 /usr/bin/dbus-daemon

00652000-00655000 rw-p 00052000 08:02 173521 /usr/bin/dbus-daemon

00e03000-00e24000 rw-p 00000000 00:00 0 [heap]

00e24000-011f7000 rw-p 00000000 00:00 0 [heap]

...

35b1800000-35b1820000 r-xp 00000000 08:02 135522 /usr/lib64/ld-2.15.so

35b1a1f000-35b1a20000 r--p 0001f000 08:02 135522 /usr/lib64/ld-2.15.so

35b1a20000-35b1a21000 rw-p 00020000 08:02 135522 /usr/lib64/ld-2.15.so

35b1a21000-35b1a22000 rw-p 00000000 00:00 0

35b1c00000-35b1dac000 r-xp 00000000 08:02 135870 /usr/lib64/libc-2.15.so

35b1dac000-35b1fac000 ---p 001ac000 08:02 135870 /usr/lib64/libc-2.15.so

35b1fac000-35b1fb0000 r--p 001ac000 08:02 135870 /usr/lib64/libc-2.15.so

35b1fb0000-35b1fb2000 rw-p 001b0000 08:02 135870 /usr/lib64/libc-2.15.so

...

f2c6ff8c000-7f2c7078c000 rw-p 00000000 00:00 0 [stack:986]

...

7fffb2c0d000-7fffb2c2e000 rw-p 00000000 00:00 0 [stack]

7fffb2d48000-7fffb2d49000 r-xp 00000000 00:00 0 [vdso]

The address field is the address space in the process that the

mapping occupies. The perms field is a set of permissions:

r = read

w = write

x = execute

s = shared

p = private (copy on write)

The offset field is the offset into the file/whatever; dev is

the device (major:minor); inode is the inode on that device.

0 indicates that no inode is associated with the memory

region, as would be the case with BSS (uninitialized data).

The pathname field will usually be the file that is backing

the mapping. For ELF files, you can easily coordinate with

the offset field by looking at the Offset field in the ELF

program headers (readelf -l).

There are additional helpful pseudo-paths:

[stack]

The initial process's (also known as the main

thread's) stack.

[stack:] (since Linux 3.4)

A thread's stack (where the is a thread ID).

It corresponds to the /proc/[pid]/task/[tid]/

path.

[vdso] The virtual dynamically linked shared object. See

vdso(7).

[heap] The process's heap.

If the pathname field is blank, this is an anonymous mapping

as obtained via mmap(2). There is no easy way to coordinate

this back to a process's source, short of running it through

gdb(1), strace(1), or similar.

status:线程

Develop>cat /proc/24475/status

Name: netio 可执行程序的名字

State: R (running) 任务状态,运行/睡眠/僵死

Tgid: 24475 线程组号

Pid: 24475 进程id

PPid: 19635 父进程id

TracerPid: 0

Uid: 0 0 0 0

Gid: 0 0 0 0

FDSize: 256 该进程最大文件描述符个数

Groups: 0VmPeak: 6330708 kB 内存使用峰值

VmSize: 268876 kB 进程虚拟地址空间大小

VmLck: 0 kB 进程锁住的物理内存大小,锁住的物理内存没法交换到硬盘

VmHWM: 16656 kB

VmRSS: 11420 kB 进程正在使用的物理内存大小

VmData: 230844 kB 进程数据段大小

VmStk: 136 kB 进程用户态栈大小

VmExe: 760 kB 进程代码段大小

VmLib: 7772 kB 进程使用的库映射到虚拟内存空间的大小

VmPTE: 120 kB 进程页表大小

VmSwap: 0kB

Threads: 5

SigQ: 0/63346

SigPnd: 0000000000000000

ShdPnd: 0000000000000000

SigBlk: 0000000000000000

SigIgn: 0000000001000000

SigCgt: 0000000180000000

CapInh: 0000000000000000

CapPrm: ffffffffffffffff

CapEff: ffffffffffffffff

CapBnd: ffffffffffffffff

Cpus_allowed: 01

Cpus_allowed_list: 0

Mems_allowed: 01

Mems_allowed_list: 0

voluntary_ctxt_switches: 201

nonvoluntary_ctxt_switches: 909

meminfocode

下面是查看整机内存使用状况的文件 /proc/meminfo

b9abcce8bda84d8b991485e9.html

Develop>cat /proc/meminfo

MemTotal: 8112280 kB 全部可用RAM大小 (即物理内存减去一些预留位和内核的二进制代码大小)

MemFree: 4188636 kB LowFree与HighFree的总和,被系统留着未使用的内存

Buffers: 34728 kB 用来给文件作缓冲大小

Cached: 289740 kB 被高速缓冲存储器(cache memory)用的内存的大小

(等于 diskcache minus SwapCache )

SwapCached: 0 kB 被高速缓冲存储器(cache memory)用的交换空间的大小

已经被交换出来的内存,但仍然被存放在swapfile中。

用来在须要的时候很快的被替换而不须要再次打开I/O端口

Active: 435240 kB 在活跃使用中的缓冲或高速缓冲存储器页面文件的大小,

除非很是必要不然不会被移做他用

Inactive: 231512 kB 在不常常使用中的缓冲或高速缓冲存储器页面文件的大小,可能被用于其余途径.

Active(anon): 361252 kB

Inactive(anon): 120688 kB

Active(file): 73988 kB

Inactive(file): 110824 kB

Unevictable: 0 kB

Mlocked: 0 kB

SwapTotal: 0 kB 交换空间的总大小

SwapFree: 0 kB 未被使用交换空间的大小

Dirty: 0 kB 等待被写回到磁盘的内存大小

Writeback: 0 kB 正在被写回到磁盘的内存大小

AnonPages: 348408 kB 未映射页的内存大小

Mapped: 33600 kB 已经被设备和文件等映射的大小

Shmem: 133536 kB

Slab: 55984 kB 内核数据结构缓存的大小,能够减小申请和释放内存带来的消耗

SReclaimable: 25028 kB 可收回Slab的大小

SUnreclaim: 30956 kB 不可收回Slab的大小(SUnreclaim+SReclaimable=Slab)

KernelStack: 1896 kB 内核栈区大小

PageTables: 8156 kB 管理内存分页页面的索引表的大小

NFS_Unstable: 0 kB 不稳定页表的大小

Bounce: 0 kB

WritebackTmp: 0 kB

CommitLimit: 2483276 kB

Committed_AS: 1804104 kB

VmallocTotal: 34359738367 kB 能够vmalloc虚拟内存大小

VmallocUsed: 565680 kB 已经被使用的虚拟内存大小

VmallocChunk: 34359162876 kB

HardwareCorrupted: 0 kB

HugePages_Total: 1536 大页面数目

HugePages_Free: 0 空闲大页面数目

HugePages_Rsvd: 0

HugePages_Surp: 0

Hugepagesize: 2048 kB 大页面一页大小

DirectMap4k: 10240 kB

DirectMap2M: 8302592 kB

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值