簡體   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