在Linux容器上运行的dotnet核心上的内存泄漏处理

时间:2019-03-18 13:02:43

标签: linux memory-leaks .net-core

我正在尝试为我的应用程序分配内存。

当内存溢出时,在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个例外,并且有处理该例外的最佳实践?

等待任何帮助。

谢谢。

0 个答案:

没有答案