我在书上读到过一个 linux 的线程大概占 8M 内存。 然而从一些人那里得到类似的描述说,其实没有那么多,有说法的线程的内核栈是 8k,还读到过下面的说法:
“ linux 的栈是通过缺页来分配内存的,不是所有栈地址空间都分配了内存。因此,8M 是最大消耗,实际的内存消耗只会略大于实际需要的内存(内部损耗,每个在 4k 以内)。”
读到这些我就有点懵了,所以想请教两个问题 1.一个 linux 线程到底占有多大内存? 2.java 中的线程是不是也有类似的说法?默认说一个线程 1M,实际内存没有那么大?
1
wencong 2019-03-05 10:00:30 +08:00
哪本书读到的
|
2
glasslion 2019-03-05 10:15:23 +08:00
8M 是指的每个线程默认分配 8M 的虚拟栈空间,但现代的软硬件可以通过 MMU 可以实现实际用到时才去占用的物理内存。
|
3
jppxhz01 2019-03-05 10:15:38 +08:00 via iPhone
8M 太可怕了
|
5
visitant 2019-03-05 10:24:32 +08:00 via iPhone
虚拟地址与物理地址之间的转换以及页表和缺页中断了解一下
|
6
halfer53 2019-03-05 10:26:49 +08:00 via Android
这取决于操作自动,还有 clone 的参数。对于内核来说,大概是 size of(task_struct) +内核的 stack 1kb。user space stack 一般一开始是 512kb,不过这取决于 runtime
|
8
GjriFeu 2019-03-05 10:45:50 +08:00 via iPhone
线程内核栈一般是两个页的大小,
用户空间栈大小和编译器有关,一般是几 M, 但是是不是预先分配的呢,我觉得应该是 |
9
kobe1941 2019-03-05 10:55:53 +08:00
以 iOS 和 Mac 为例,iOS 的主线程栈内存占用最大 1M,子线程 512kb,Mac 的主线程最大 8M。
测试这个值很方便,你只要定义一个局部变量的 int 数组就可以了,看看数组的长度可以到多大的时候系统会栈溢出导致崩溃。 |
10
misaka19000 2019-03-05 11:02:09 +08:00 via Android
最简单的办法是翻 linux 源码去了解
|
12
lff0305 2019-03-05 14:35:04 +08:00
一个 thread 的内存占用,包括创建线程的时候可以指定参数来设置 stack 的大小,不指定就用默认的 stack 大小
加上内核保存这个 thread 的状态信息的各种 struct。 参考 pthread_create, pthread_attr_t Win 下也一样。 |