linux 堆大小 linux du命令

大家好,关于linux 堆大小很多朋友都还不太明白,今天小编就来为大家分享关于linux du命令的知识,希望对各位有所帮助!

linux 设置堆栈大小 为无限制

在/etc/profile的最后面添加ulimit-s unlimited保存,source/etc/profile使修改文件生效

linux查看修改线程默认栈空间大小:ulimit-s

1、通过命令 ulimit-s查看linux的默认栈空间大小,默认情况下为10240即10M

2、通过命令 ulimit-s设置大小值临时改变栈空间大小:ulimit-s 102400,即修改为100M

3、可以在/etc/rc.local内加入 ulimit-s 102400则可以开机就设置栈空间大小

4、在/etc/security/limits.conf中也可以改变栈空间大小:

#<domain><type><item><value>

* soft stack 102400

重新登录,执行ulimit-s即可看到改为102400即100M

Linux系统默认堆栈大小分析linux默认堆栈大小

现代操作系统中,Linux系统成为一种新兴的操作系统,它一般各种计算机硬件平台上都得到了广泛的应用。Linux系统的出现给用户带来了各种便捷。其中,Linux系统默认的堆栈大小,可能会对Linux的稳定和性能造成影响。下面就来分析Linux系统中默认的堆栈大小。

首先,Linux系统上所有进程的默认堆栈大小为8M。由于进程会使用大量的API函数,而大多数API函数会在堆栈上保存一些重要的参数,因此堆栈的大小会影响进程运行的稳定性和性能。

其次,如果Linux系统的进程的堆栈大小太小的话,将会影响进程的运行。当进程调用API函数时,如果堆栈上的空间受限,则进程可能会发生段错误,导致程序的异常终止。

最后,Linux的堆栈大小可以通过ulimit-s来查看,也可通过/etc/security/limits.conf来进行调整,以满足不同进程动态申请更多堆栈空间的需求。比如:

//查看默认堆栈大小

$ ulimit-s

8192

//调整默认堆栈大小

$ vi/etc/security/limits.conf

*– stack 16384

以上,就是对Linux系统中默认堆栈大小的分析,虽然默认堆栈大小为8M,但是用户可以根据自己的需要调整堆栈大小,来满足进程运行的安全性和高效性的要求。

如何查看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

阅读剩余
THE END