繁体   English   中英

服务器上的内存分配/ 100%堆gen2碎片

[英]Memory Allocation / 100% Heap gen2 Fragmentation on Server

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

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

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

我的问题1.在这种情况下什么会导致内存碎片? 2.是否可以通过某种方式配置Windows服务,使其表现得像我的桌面? 3.我将如何去找出导致问题的原因?

非常感谢

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

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

~MyClass
{
    while (true)
    {
    }
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM