打开一个编译选项启用ASan的程序:
AddressSanitizer failed to allocate 0xdfff0001000 (15392894357504) bytes
然后程序启动失败。
原因:
[cfe-dev] Question about Clang/LLVM addresssanitizer
/proc/sys/vm/overcommit_memory
是一个用于控制内存过度承诺(overcommit)策略的虚拟文件。
内存过度承诺是指在分配内存时,操作系统是否允许分配比实际物理内存更多的内存。该策略允许应用程序分配比可用内存更多的内存,但这可能导致系统在实际使用时出现内存不足的情况。
/proc/sys/vm/overcommit_memory
文件的值可以设置为以下三个选项之一:
0:表示内存过度承诺策略被禁用。这是默认值,表示内核会根据实际的物理内存和交换空间来决定是否允许分配内存。
1:表示内存过度承诺策略被启用。内核会允许分配超过实际物理内存大小的内存,但在实际使用时可能会导致Out-of-Memory(OOM)错误。
2:表示内存过度承诺策略被启用,并且在分配内存时考虑了交换空间的大小。这种模式下,内核会允许分配超过实际物理内存和交换空间之和的内存。
通过修改/proc/sys/vm/overcommit_memory
文件的值,可以调整系统的内存过度承诺策略,以满足特定应用程序或系统需求。
解决方法:
# 1. 检查/proc/sys/vm/overcommit_memory的值,如果是2,则修改为0
sudo bash -c "echo 0 > /proc/sys/vm/overcommit_memory"
# 2. 虚拟内存设置为无限制
ulimit -v unlimited