一个线程到底占有多大内存? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
aiqier
V2EX    程序员

一个线程到底占有多大内存?

  •  1
     
  •   aiqier 2019-03-05 09:56:43 +08:00 9300 次点击
    这是一个创建于 2411 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我在书上读到过一个 linux 的线程大概占 8M 内存。 然而从一些人那里得到类似的描述说,其实没有那么多,有说法的线程的内核栈是 8k,还读到过下面的说法:

    “ linux 的栈是通过缺页来分配内存的,不是所有栈地址空间都分配了内存。因此,8M 是最大消耗,实际的内存消耗只会略大于实际需要的内存(内部损耗,每个在 4k 以内)。”

    读到这些我就有点懵了,所以想请教两个问题 1.一个 linux 线程到底占有多大内存? 2.java 中的线程是不是也有类似的说法?默认说一个线程 1M,实际内存没有那么大?

    12 条回复    2019-03-05 14:35:04 +08:00
    wencong
        1
    wencong  
       2019-03-05 10:00:30 +08:00
    哪本书读到的
    glasslion
        2
    glasslion  
       2019-03-05 10:15:23 +08:00
    8M 是指的每个线程默认分配 8M 的虚拟栈空间,但现代的软硬件可以通过 MMU 可以实现实际用到时才去占用的物理内存。
    jppxhz01
        3
    jppxhz01  
       2019-03-05 10:15:38 +08:00 via iPhone
    8M 太可怕了
    aiqier
        4
    aiqier  
    OP
       2019-03-05 10:20:00 +08:00
    @wencong ulimit -s 就是 8M
    visitant
        5
    visitant  
       2019-03-05 10:24:32 +08:00 via iPhone
    虚拟地址与物理地址之间的转换以及页表和缺页中断了解一下
    halfer53
        6
    halfer53  
       2019-03-05 10:26:49 +08:00 via Android
    这取决于操作自动,还有 clone 的参数。对于内核来说,大概是 size of(task_struct) +内核的 stack 1kb。user space stack 一般一开始是 512kb,不过这取决于 runtime
    hitmanx
        7/span>
    hitmanx  
       2019-03-05 10:32:52 +08:00
    @halfer53 内核的 stack 1kb 指的是什么?
    GjriFeu
        8
    GjriFeu  
       2019-03-05 10:45:50 +08:00 via iPhone
    线程内核栈一般是两个页的大小,
    用户空间栈大小和编译器有关,一般是几 M, 但是是不是预先分配的呢,我觉得应该是
    kobe1941
        9
    kobe1941  
       2019-03-05 10:55:53 +08:00
    以 iOS 和 Mac 为例,iOS 的主线程栈内存占用最大 1M,子线程 512kb,Mac 的主线程最大 8M。
    测试这个值很方便,你只要定义一个局部变量的 int 数组就可以了,看看数组的长度可以到多大的时候系统会栈溢出导致崩溃。
    misaka19000
        10
    misaka19000  
       2019-03-05 11:02:09 +08:00 via Android
    最简单的办法是翻 linux 源码去了解
    halfer53
        11
    halfer53  
       2019-03-05 11:55:03 +08:00 via Android
    @hitmanx 对于每一个线程,内核会单独建一个 stack 给内核用
    lff0305
        12
    lff0305  
       2019-03-05 14:35:04 +08:00
    一个 thread 的内存占用,包括创建线程的时候可以指定参数来设置 stack 的大小,不指定就用默认的 stack 大小
    加上内核保存这个 thread 的状态信息的各种 struct。

    参考 pthread_create, pthread_attr_t

    Win 下也一样。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     906 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 21:58 PVG 05:58 LAX 14:58 JFK 17:58
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86