首页 > 解决方案 > .net-core 没有立即释放大对象(在 linux 下)的原因可能是什么?

问题描述

我有以下代码片段,它下载了一个关于100mb大 zip 文件,然后将被反序列化为Foo进一步处理。此代码每天执行一次。

Stream stream = await downloader.DownloadStream().ConfigureAwait(false);

if (stream.CanSeek && stream.Length == 0)
{
    throw new IOException("Error! Received stream is empty.");
}

ZipArchive archive;

try
{
    archive = new ZipArchive(stream);
}
catch (InvalidDataException)
{
    throw new IOException("Error! Received stream is no zip file.");
}

using (var reader = new StreamReader(archive.Entries[0].Open()))
{
    Foo foo = JsonConvert.DeserializeObject<Foo>(reader.ReadToEnd());
    [...]
}

archive.Dispose();
stream.Dispose();

现在,当该代码启动时,内存使用量会跃升至大约2500mb. 到目前为止一切都很好,我想说,很常见。

(也许?)不常见的是,内存有时需要几天才能释放。现在,当在多个实例上运行该代码时,假设在k8s内部,您会看到以下内存使用模式。

超过 7 天的内存使用情况

所以你看,内存最终被释放了,所以我怀疑我的代码中有一些关于可能泄漏的错误。问题是这是否是预期的行为,clr或者我是否可以增强这种行为。我已经读到的是,这肯定会涉及到大对象堆。但是很难找到内部堆在 linux 下的本机行为。

因此,对于在k8s中托管它,这意味着我需要为最坏的情况规划资源,所有托管实例都将2500mb分配。

标签: asp.net-core.net-corememory-managementgarbage-collection

解决方案


推荐阅读