【问题标题】:Memory Allocation / 100% Heap gen2 Fragmentation on Server内存分配/服务器上的 100% Heap gen2 碎片
【发布时间】:2018-05-03 07:26:15
【问题描述】:

我有一个 .net Windows 服务应用程序,它在启动时会分配服务器上的所有现有内存。在内存分析之后,我可以看到,在第 2 代堆中分配的内存中有 90% 是空闲的。碎片化率为 100%

在我的工作站上通过 .exe 运行应用程序不会产生相同的结果。这里的内存分配接缝正常。

我尝试强制每 5 秒进行一次 GC,以查看 GC 是否存在问题。同样的问题

我的问题 1. 什么情况下会导致内存碎片? 2. 有没有办法配置 Windows 服务使其表现得像我的桌面? 3. 我该如何去找出问题的原因?

非常感谢

【问题讨论】:

  • “90% 的分配内存在 Gen2 堆中是空闲的”是什么意思?内存是空闲的还是分配的?如果它是免费的,它不在 Gen2 中。

标签: c# .net memory-management heap-memory


【解决方案1】:

服务和桌面应用程序之间最重要的区别在于运行应用程序的用户。从“服务”控制面板上的“登录”选项卡中检查它。默认值为“本地系统帐户”,其权限可能低于桌面用户。将其更改为您的当前用户并再次检查您的应用程序。

所有即将死亡并具有终结器的对象都被放入一个称为“终结器队列”的队列中。 GC 一个接一个地运行终结器,如果终结器卡在无限循环中,则整个 GC 被阻塞。最明显的效果是,内存使用量的不断增加。您可以通过添加这样的代码来轻松模拟它。

~MyClass
{
    while (true)
    {
    }
}

首先,检查所有终结器。从本地系统帐户执行可能会在某处导致无限循环。

也许您没有任何终结器,那么您应该对其进行一些启发式分析。还有一个名为 dotMemory 的实用程序(不是免费的,但有一些试用期),它会遍历所有堆中未释放的对象。它可以提供帮助。

【讨论】:

    猜你喜欢
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 2018-02-12
    • 1970-01-01
    • 2013-12-24
    • 2013-08-14
    • 2011-07-25
    相关资源
    最近更新 更多