服务器

时间:2017-11-20 06:01:29

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

我有一个.net Windows服务应用程序,在启动时会在服务器上分配所有现有的内存。在内存分析之后,我可以看到,gen 2 Heaps中分配的内存的90%是免费的。碎片是100%

在我的工作站上通过.exe运行应用程序不会生成相同的东西。内存分配接缝正常。

我已经尝试每隔5秒强制GC一次,看看GC是否有问题。同样的问题

我的问题 1.在这种情况下,什么可能导致内存碎片? 2.有没有办法以一种使其行为像我的桌面一样的方式配置Windows服务? 3.我将如何找出导致问题的原因?

非常感谢

1 个答案:

答案 0 :(得分:0)

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

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

~MyClass
{
    while (true)
    {
    }
}

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

也许你没有任何终结者,那么你应该做一些启发式的。还有一个名为dotMemory的实用程序(不是免费的,但有一些试用期),它遍历所有堆中的未被释放的对象。它可以帮助。

相关问题