【发布时间】:2019-10-23 06:50:05
【问题描述】:
当我在 linux 服务器上运行我的 .NET Core 应用程序时,我得到了 OutOfMemoryException。我完全不知道如何调试它,因为没有提供堆栈跟踪。唯一的输出是:“未处理的异常:OutOfMemoryException。”
在抛出这个异常的那一刻,还有足够的空间。使用了 200 GB 的 RAM,300 GB 是免费的,所以我认为内存应该没有任何问题。
它发生的那一刻是我尝试将一个对象序列化为 protobuf。最终文件应约为 1GB。我以前从未遇到过这个问题,并且模型序列化得很好。
我将非常感谢任何见解。我真的需要让它工作:(我已经尝试在序列化之前调用它,因为我认为问题出在碎片上。经过 10 个小时的计算,我意识到事实并非如此。
_logger.LogDebug("LOH compaction start");
GCSettings.LargeObjectHeapCompactionMode =
GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect();
_logger.LogDebug("LOH compaction end");
抛出异常时我正在执行的代码是这样的:
public static void Serialize<T>(this ProtobufSerializer protobufSerializer, string filePath, T serializationObject)
{
using (var fileStream = new FileStream(filePath, FileMode.Create))
{
protobufSerializer.Serialize(fileStream, serializationObject);
}
}
【问题讨论】:
-
可怕的数字。它绝不是由按需页面虚拟内存操作系统上没有足够的 RAM 引起的。在 Linux 上,您首先要确保系统交换空间足够大。
-
您能否编辑您的帖子以包含异常发生时正在执行的代码? (顺便说一句,你到底在序列化这么大的东西?)
-
@JohnWu 我编辑了我的帖子。这些是用于预测功能销售的模型。有关于公司中每家商店和产品的信息,以及我们应该使用哪种模型进行这种组合以获得最佳预测
-
@HansPassant 我从没想过交换大小。它是 30GB。 500GB RAM可以吗?
-
这太低了,毫无意义。与配置机器的人交谈,他们可能会选择这么低的数字,认为半 TB 的 RAM 总是足够的。直到它不是。
标签: c# out-of-memory