欢迎分享,转载请注明来源:内存溢出
如何查看Linux内存中的程序所有堆的地址
linux 下面查看内存有多种渠道,比如通过命令 ps ,top,free 等,比如通过/proc系统,一般需要比较详细和精确地知道整机内存/某个进程内存的使用情况,最好通过/proc 系统,下面介绍/proc系统下内存相关的几个文件单个进程的内存查看 cat /proc/[pid] 下面有几个文件: maps , smaps, statusmaps 文件可以查看某个进程的代码段、栈区、堆区、动态库、内核区对应的虚拟地址,如果你还不了解linux进程的内存空间,可以参考这里。下图是maps文件内存示例Develop>cat /proc/self/maps 00400000-0040b000 r-xp 00000000 fd:00 48 /mnt/cf/orig/root/bin/cat0060a000-0060b000 r--p 0000a000 fd:00 48 /mnt/cf/orig/root/bin/cat0060b000-0060c000 rw-p 0000b000 fd:00 48 /mnt/cf/orig/root/bin/cat 代码段0060c000-0062d000 rw-p 00000000 00:00 0 [heap] 堆区7f1fff43b000-7f1fff5d4000 r-xp 00000000 fd:00 861 /mnt/cf/orig/root/lib64/libc-2.15.so7f1fff5d4000-7f1fff7d3000 ---p 00199000 fd:00 861 /mnt/cf/orig/root/lib64/libc-2.15.so7f1fff7d3000-7f1fff7d7000 r--p 00198000 fd:00 861 /mnt/cf/orig/root/lib64/libc-2.15.so7f1fff7d7000-7f1fff7d9000 rw-p 0019c000 fd:00 861 /mnt/cf/orig/root/lib64/libc-2.15.so7f1fff7d9000-7f1fff7dd000 rw-p 00000000 00:00 0 7f1fff7dd000-7f1fff7fe000 r-xp 00000000 fd:00 2554 /mnt/cf/orig/root/lib64/ld-2.15.so7f1fff9f9000-7f1fff9fd000 rw-p 00000000 00:00 0 7f1fff9fd000-7f1fff9fe000 r--p 00020000 fd:00 2554 /mnt/cf/orig/root/lib64/ld-2.15.so7f1fff9fe000-7f1fff9ff000 rw-p 00021000 fd:00 2554 /mnt/cf/orig/root/lib64/ld-2.15.so7f1fff9ff000-7f1fffa00000 rw-p 00000000 00:00 0 7fff443de000-7fff443ff000 rw-p 00000000 00:00 0 [stack] 用户态栈区7fff443ff000-7fff44400000 r-xp 00000000 00:00 0 [vdso]ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] 内核区有时候可以通过不断查看某个进程的maps文件,通过查看其虚拟内存(堆区)是否不停增长来简单判断进程是否发生了内存溢出。maps文件只能显示简单的分区,smap文件可以显示每个分区的更详细的内存占用数据下图是smaps文件内存示例, 实际显示内容会将每一个区都显示出来,下面我只拷贝了代码段和堆区,每一个区显示的内容项目是一样的,smaps文件各项含义可以参考这里Develop>cat /proc/self/smaps 00400000-0040b000 r-xp 00000000 fd:00 48 /mnt/cf/orig/root/bin/catSize: 44 kB 虚拟内存大小Rss: 28 kB 实际使用物理内存大小Pss: 28 kBShared_Clean: 0 kB 页面被改,则是dirty,否则是clean,页面引用计数>1,是shared,否则是privateShared_Dirty: 0 kBPrivate_Clean:28 kBPrivate_Dirty: 0 kBReferenced: 28 kBAnonymous: 0 kBAnonHugePages: 0 kBSwap: 0 kB 处于交换区的页面大小KernelPageSize:4 kB *** 作系统一个页面大小MMUPageSize: 4 kB 体系结构MMU一个页面大小 Locked:0 kB0060c000-0062d000 rw-p 00000000 00:00 0 [heap]Size:132 kBRss: 8 kBPss: 8 kBShared_Clean: 0 kBShared_Dirty: 0 kBPrivate_Clean: 0 kBPrivate_Dirty: 8 kBReferenced:8 kBAnonymous: 8 kBAnonHugePages: 0 kBSwap: 0 kBKernelPageSize:4 kBMMUPageSize: 4 kBLocked:0 kB下图是status文件内存示例, 加粗部分是内存相关的统计,Develop>cat /proc/24475/statusName:netio 可执行程序的名字State:R (running) 任务状态,运行/睡眠/僵死Tgid:24475 线程组号Pid:24475 进程idPPid:19635 父进程idTracerPid:0 Uid:0000Gid:0000FDSize:256 该进程最大文件描述符个数Groups:0 VmPeak: 6330708 kB 内存使用峰值VmSize: 268876 kB 进程虚拟地址空间大小VmLck: 0 kB 进程锁住的物理内存大小,锁住的物理内存无法交换到硬盘VmHWM: 16656 kBVmRSS: 11420 kB 进程正在使用的物理内存大小VmData: 230844 kB 进程数据段大小VmStk: 136 kB 进程用户态栈大小VmExe: 760 kB 进程代码段大小VmLib:7772 kB 进程使用的库映射到虚拟内存空间的大小VmPTE: 120 kB 进程页表大小VmSwap: 0 kBThreads:5SigQ:0/63346SigPnd:0000000000000000ShdPnd:0000000000000000SigBlk:0000000000000000SigIgn:0000000001000000SigCgt:0000000180000000CapInh:0000000000000000CapPrm:ffffffffffffffffCapEff:ffffffffffffffffCapBnd:ffffffffffffffffCpus_allowed:01Cpus_allowed_list:0Mems_allowed:01Mems_allowed_list:0voluntary_ctxt_switches:201nonvoluntary_ctxt_switches:909可以看到,linux下内存占用是一个比较复杂的概念,不能简单通过一个单一指标就判断某个程序“内存消耗”大小,原因有下面2点:进程所申请的内存不一定真正会被用到(malloc或mmap的实现)真正用到了的内存也不一定是只有该进程自己在用 (比如动态共享库)关于内存的使用分析及本文几个命令的说明也可以参考这里下面是查看整机内存使用情况的文件 /proc/meminfoDevelop>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 kBActive(file): 73988 kBInactive(file): 110824 kBUnevictable: 0 kBMlocked: 0 kBSwapTotal: 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 kBWritebackTmp: 0 kBCommitLimit: 2483276 kBCommitted_AS:1804104 kBVmallocTotal: 34359738367 kB 可以vmalloc虚拟内存大小VmallocUsed: 565680 kB 已经被使用的虚拟内存大小VmallocChunk: 34359162876 kBHardwareCorrupted: 0 kBHugePages_Total:1536 大页面数目HugePages_Free:0 空闲大页面数目HugePages_Rsvd:0HugePages_Surp:0Hugepagesize: 2048 kB 大页面一页大小DirectMap4k: 10240 kB DirectMap2M: 8302592 kB您在编程的时候出现的这个问题吗?一般这个问题出现是因为程序当中分配内存过大,或者内存不够,内存条坏死导致的。可以先查看是不是内存有问题,有问题重新换一根内存,或者查看程序当中是否分配了过多的内存,如果过多,减少内存的分配,还可以查看是否有程序持续内存泄露,导致内存分配不合理。
赞
(0)
打赏
微信扫一扫
支付宝扫一扫
mac上能安装linux么
上一篇
2023-04-07
Linux中在当前目录下查找某个文件。
下一篇
2023-04-07
评论列表(0条)