为何含printf的无限循环耗尽RAM?无操作循环却正常运行?
为什么无限循环调用printf会耗尽RAM,空循环却不会?
核心原因:输出缓冲引发的内存堆积
- 当你在无限循环里执行
printf("Do nothing\n")时,输出内容不会直接写到硬件设备,而是先暂存在C标准库维护的用户态输出缓冲区里,之后再由缓冲区刷入内核的页缓存,最终才会写入设备。 - stdout的缓冲模式默认分两种场景:
- 连接终端时是行缓冲:遇到
\n就会自动把缓冲区内容刷到内核,这种情况一般不会耗光内存;但如果stdout没连终端(比如输出重定向到文件、管道,或者程序后台运行后终端断开),就会切换成全缓冲模式。 - 全缓冲模式下,只有缓冲区被填满、手动调用
fflush(stdout)或者程序退出时,才会刷新内容。要是输出速度远远快于设备的写入速度,内核页缓存和C库的用户态缓冲就会不断累积数据,最终把系统RAM耗光。
- 连接终端时是行缓冲:遇到
- 空循环的代码没有任何数据输出或内存分配操作,只是反复执行空指令,不会产生内存堆积,自然不会出现内存耗尽的情况。
误区澄清
- 不是
printf本身占内存:单次printf的内存开销微乎其微,问题出在没被及时刷出去的输出数据在内存里越堆越多。 - 不存在“stdout过载”的说法:本质是缓冲机制下的数据没法及时写到设备,导致内存被持续占用。
内容的提问来源于stack exchange,提问作者Diego De Leonardis
相关产品推荐
相关产品推荐

