我正在尝试为我的应用程序分配内存。
当内存溢出时,在Linux容器上运行应用程序(基于“ microsoft / dotnet:2.2-runtime”)也不例外, 但是在运行docker时有137个异常,并且在有该异常时docker被杀死并停止工作。
my_docker_name退出,代码为137
当内存接近100%使用率而不是100%使用率时,就会发生上述现象。
此外,我意识到在Linux的dockers上运行时,内存分配具有不同的行为。内存不是在new命令上分配的,而是在将new分配给值时分配的。
即:
List<byte[]> Data;
int maxVal = 1024 * 1024 * 1024;
Data = new List<byte[]>();
for (int i = 0; i < 1000; i++)
{
Console.WriteLine("i:{0}", i);
Data.Add(new byte[maxVal]);
}
以上代码在Windows上用尽了内存异常,但在linux-container上却没有。在Linux上,只有在分配时才可能发生:
byte[] b = new byte[1024L * 1024 * 1024];
byte[] a = b; // cause the 137 error.
通过htop命令查看内存时,我看到内存使用率几乎是100%,但不是100%(分配后也是如此)。
我认为有一些额外的内存用于处理内核或系统,但是我不知道如何处理或检查该内存。
代码被意外杀死(分配的内存> 15G之后,在计算机上只有16G。在try + catch上也未捕获未处理的异常)。
如何防止该异常?
我正在尝试检查点网核心的可用内存。
运行以下内容时:
Process p = Process.GetCurrentProcess();
long l = p.PagedMemorySize64;
Console.WriteLine("mem paged:{0}", l);
l = GC.GetTotalMemory(false);
Console.WriteLine("mem GC total:{0}", l);
在Window中,我得到的结果与Linux(unbuntu)不同。
第一个writeline在linux上返回0的结果(在Windows上我得到实际大小)。 第二行我有合理的值,但是我想知道可用的内存(因此我会在分配内存之前知道要处理的代码)。
Linux计算机上的内存为16G字节(但我不知道要硬编码此值-我想计算可用内存)。
我在docker上运行了多个项目,因此它们参与了相同的内存。
与dotnet不同,即:
ObjectQuery wql = new ObjectQuery("SELECT * FROM Win32_OperatingSystem");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(wql);
ManagementObjectCollection results = searcher.Get();
foreach (ManagementObject result in results)
{
Console.WriteLine("Total Visible Memory: {0}KB",
result["TotalVisibleMemorySize"]);
Console.WriteLine("Free Physical Memory: {0}KB",
result["FreePhysicalMemory"]);
Console.WriteLine("Total Virtual Memory: {0}KB",
result["TotalVirtualMemorySize"]);
Console.WriteLine("Free Virtual Memory: {0}KB",
result["FreeVirtualMemory"]);
}
以上内容不适用于C#内核。
还找到了一个链接:Get memory available on .NET core 但没有帮助-我的'PrivateMemorySize64'结果为零。
如何防止137个例外,并且有处理该例外的最佳实践?
等待任何帮助。
谢谢。