asp.net-core - .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内部,您会看到以下内存使用模式。
所以你看,内存最终被释放了,所以我怀疑我的代码中有一些关于可能泄漏的错误。问题是这是否是预期的行为,clr
或者我是否可以增强这种行为。我已经读到的是,这肯定会涉及到大对象堆。但是很难找到内部堆在 linux 下的本机行为。
因此,对于在k8s中托管它,这意味着我需要为最坏的情况规划资源,所有托管实例都将2500mb
分配。
解决方案
推荐阅读
- laravel - Laravel,尝试使用数据库中的值进行计数
- css - Kendo AutoComplete 用白框覆盖网格
- selenium - 如何为字段编写 xpath 并验证字段
- verilog - 接口 Modport 连接到 SystemVerilog 中的测试台环境
- c# - 新列表更新原始列表
- css - 使滚动始终显示在材料选择中
- swift - 应用内购买付款交易无法正常运行
- unity3d - 在 Unity 中使用自定义着色器遮罩 3D 对象
- ios - 即使在暗模式打开时,iOS 上的平台亮度仍然很亮 - Flutter
- javascript - 根据黑名单检查具有多个单词的术语的有效方法