linux 堆?debian docker
大家好,今天给各位分享linux 堆的一些知识,其中也会对debian docker进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!
如何查看Linux内存中的程序所有堆的地址
linux下面查看内存有多种渠道,比如通过命令 ps,top,free等,比如通过/proc系统,一般需要比较详细和精确地知道整机内存/某个进程内存的使用情况,最好通过/proc系统,下面介绍/proc系统下内存相关的几个文件
单个进程的内存查看 cat/proc/[pid]下面有几个文件: maps, smaps, status
maps文件可以查看某个进程的代码段、栈区、堆区、动态库、内核区对应的虚拟地址,如果你还不了解linux进程的内存空间,可以参考这里。
下图是maps文件内存示例
Develop>cat/proc/self/maps
00400000-0040b000 r-xp 00000000 fd:00 48/mnt/cf/orig/root/bin/cat
0060a000-0060b000 r--p 0000a000 fd:00 48/mnt/cf/orig/root/bin/cat
0060b000-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.so
7f1fff5d4000-7f1fff7d3000---p 00199000 fd:00 861/mnt/cf/orig/root/lib64/libc-2.15.so
7f1fff7d3000-7f1fff7d7000 r--p 00198000 fd:00 861/mnt/cf/orig/root/lib64/libc-2.15.so
7f1fff7d7000-7f1fff7d9000 rw-p 0019c000 fd:00 861/mnt/cf/orig/root/lib64/libc-2.15.so
7f1fff7d9000-7f1fff7dd000 rw-p 00000000 00:00 0
7f1fff7dd000-7f1fff7fe000 r-xp 00000000 fd:00 2554/mnt/cf/orig/root/lib64/ld-2.15.so
7f1fff9f9000-7f1fff9fd000 rw-p 00000000 00:00 0
7f1fff9fd000-7f1fff9fe000 r--p 00020000 fd:00 2554/mnt/cf/orig/root/lib64/ld-2.15.so
7f1fff9fe000-7f1fff9ff000 rw-p 00021000 fd:00 2554/mnt/cf/orig/root/lib64/ld-2.15.so
7f1fff9ff000-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/cat
Size: 44 kB虚拟内存大小
Rss: 28 kB实际使用物理内存大小
Pss: 28 kB
Shared_Clean: 0 kB页面被改,则是dirty,否则是clean,页面引用计数>1,是shared,否则是private
Shared_Dirty: 0 kB
Private_Clean: 28 kB
Private_Dirty: 0 kB
Referenced: 28 kB
Anonymous: 0 kB
AnonHugePages: 0 kB
Swap: 0 kB处于交换区的页面大小
KernelPageSize: 4 kB操作系统一个页面大小
MMUPageSize: 4 kB体系结构MMU一个页面大小
Locked: 0 kB
0060c000-0062d000 rw-p 00000000 00:00 0 [heap]
Size: 132 kB
Rss: 8 kB
Pss: 8 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 8 kB
Referenced: 8 kB
Anonymous: 8 kB
AnonHugePages: 0 kB
Swap: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Locked: 0 kB
下图是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: 0
VmPeak: 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: 0 kB
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
可以看到,linux下内存占用是一个比较复杂的概念,不能
简单通过一个单一指标就判断某个程序“内存消耗”大小,原因有下面2点:
进程所申请的内存不一定真正会被用到(malloc或mmap的实现)
真正用到了的内存也不一定是只有该进程自己在用(比如动态共享库)
关于内存的使用分析及本文几个命令的说明也可以参考这里
下面是查看整机内存使用情况的文件/proc/meminfo
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
linux堆内存管理深入分析linux堆内存
怎么解决LINUX堆栈溢出内存的问题?
一般是由于数组指针访问越界;
或者是野指针造成
解决的办法:可以将代码按功能段,一段一段测试,
//测试一块代码时,先注释掉其它代码
找出错误出现的地方,修正
如果,因为程序里使用的堆栈大小大于默认的造成出错
需要修改默认的堆栈大小的值
linux文件系统扩容?
1.增加硬盘、或新建分区
2.在硬盘或分区上创建物理卷PV,例如新硬盘为sdb
pvcreate/dev/sdb
3.扩展卷组VG,例如:文件系统所在的VG名为vgname
vgextendvgname/dev/sdb
4.扩展逻辑卷LV,例如:文件系统所在的LV名为lvname,增加10G
lvextend+L10G/dev/vgname/lvname
5.扩展文件系统
resize2fs/dev/vgname/lvname
如果没用逻辑卷管理,文件系统是无法扩展的;如果逻辑卷有足够的剩余空间(vgdisplay可看),第1、2、3步可省略
linux中申请堆内存的方法?
有两种方法实现对linux分区的扩容。第一种方式是软链接(符号链接)。举个例子来说明下软链接,假如你的/b目录满了,不能存储文件。这时你把/a目录链接到/b目录,你在访问/b目录时实际是访问/a目录里面的空间。
软链接的创建方式为:“ln-s目录a目录b/文件夹c”。意思是在目录b下创建一个文件夹名为c的软链接,链接地址是目录a。在向目录b下文件夹c存放文件时,实际存放位置是目录a。
软链接的方式可以在不改变数据的情况下通过链接到另外的空间解决了容量不足的问题,但是如果硬盘空间本身不足,那么就要用另外的解决方案了——增加磁盘。在扩容磁盘前需要将容量已满的/b目录中的数据拷贝到其他位置。此种方式能从根本上解决磁盘容量不足的问题。
linux如何把磁盘空间填满?
linux把磁盘空间填满,要进行磁盘管理,首先我们需要知道磁盘的基本使用状况,使用了多少,还剩多少等等。df命令可以帮助我们看到它。
查看磁盘分区使用状况,显示指定磁盘文件的可用空间。如果没有文件名被指定,则所有当前被挂载的文件系统的可用空间将被显示。默认情况下,磁盘空间将以1KB为单位进行显示。
Linux进程虚拟地址空间的分布,以及堆和栈的区别
一、具体分布如图所示:
二、关于堆和栈
(1)分配方式:
栈:由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
堆:一般由程序员分配释放,它的分配方式类似于链表。
(2)申请后系统的响应:
栈:只要所申请的空间小于栈的剩余空间,则系统为程序分配内存,否则栈溢出。
堆:操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,遍历该链表,找出第一个大于所申请空间的节点,然后将其从链表中删除并分配,如果没用完,则系统会把多余的重新放回到链表中。
(3)申请大小的限制:
栈:栈是高地址向低地址扩展的连续内存,栈的大小一般是2M;
堆:堆是低地址向高地址扩展的不连续内存,堆的大小与计算机有效的虚拟内存有关系。
(4)申请效率:
栈:由系统自动分配,速度较快;
堆:速度慢,容易产生内存碎片;
关于Linux命令的介绍,看看《linux就该这么学》,具体关于这一章地址3w(dot)linuxprobe/chapter-02(dot)html.