我编写了一个dotnet
分配内存的简单应用程序。它耗尽了机器上的所有物理内存,然后以OutOfMemoryException
. 但是我的系统有一个交换文件,它从未被dotnet
. 其他应用程序使用交换就好了。我玩过swappiness(60、100、1),但这没有效果。
我的理解是,Linux 上的进程可以消耗它想要的所有物理内存,如果没有剩余内存,则该内存将被写入交换文件/分区。只有当交换和物理内存都已满时,应用程序才会因 OOM 而崩溃。这是其他应用程序所做的,但不是dotnet
应用程序。
我试过 dotnet core 3.1 和 5.0,使用的操作系统是 Ubuntu 20.04。
编辑:我的测试代码:
namespace TestProject
{
class Program
{
static List<byte[]> l = new List<byte[]>();
static void Main(string[] args)
{
while (true)
{
var b = new byte[100 * 1000 * 1024];
l.Add(b);
}
}
}
}