代码之家  ›  专栏  ›  技术社区  ›  somecoolname

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

  •  1
  • somecoolname  · 技术社区  · 7 年前

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

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

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

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

    非常感谢

    1 回复  |  直到 7 年前
        1
  •  0
  •   Savas Alp    7 年前

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

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

    ~MyClass
    {
        while (true)
        {
        }
    }
    

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

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