Почему этот класс отслеживает слабые ссылки? - PullRequest
2 голосов
/ 07 ноября 2010

Я пытаюсь понять причину утечки памяти в клиентском приложении VB.NET ASP.NET (мы не писали код).

Две вещи возникают у меня:

  1. У них есть сборка доступа к данным с одним классом доступа к данным, который при реализации запускает этот код в конструкторе:

    public SqlServer(string connString)
    {
        List<WeakReference> list = __ENCList;
        lock (list)
        {
            __ENCList.Add(new WeakReference(this));
        }
        // misc other tasks of no further interest
    }
    

    __ENCList объявлено как: private static List<WeakReference> __ENCList; в классе.

    Что за этим стоит? Я где-то читал, что VB.NET использует это для целей редактирования и продолжения, но понял, что это не будет генерироваться в сборках релиза. Как .NET Reflector, так и ILDASM показывают, что это находится в сборке доступа к данным производственной сборки.

  2. Копаться с WinDbg и делать !dumpheap -stat Я вижу это:

66101820    10269       451836 System.Web.UI.Control+OccasionalFields
7a5eecbc    22936       458720 System.Collections.Specialized.ListDictionary+DictionaryNode
79331754     2285       470684 System.Char[]
648c91f4    10438       501024 System.Configuration.ConfigurationValues
7a5e9eb0    37978       607648 System.Collections.Specialized.NameObjectCollectionBase+NameObjectEntry
648c9434    32651       653020 System.Configuration.ConfigurationValue
7a5e27a0     6567       788040 System.ComponentModel.ReflectPropertyDescriptor
7932ea08    18318       879264 System.Signature
79332b54    42528      1020672 System.Collections.ArrayList
79333178    18348      1027488 System.Collections.Hashtable
79332cc0     7535      1346108 System.Int32[]
7932dd5c    43220      2420320 System.Reflection.RuntimePropertyInfo
7932fde0    72902      4082512 System.Reflection.RuntimeMethodInfo
79333274    19162      4321680 System.Collections.Hashtable+bucket[]
79333594     3475      4638780 System.Byte[]
793042f4   134867      6473100 System.Object[]
000f6f80      394     24556172      Free
79330b24   174120     26678884 System.String
Total 1098618 objects
Fragmented blocks larger than 0.5 MB:
    Addr     Size      Followed by
33b7b58c    2.1MB         33d99cf4 System.Data.ProviderBase.DbConnectionClosedBusy
41635a50    0.6MB         416c873c System.Data.ProviderBase.DbConnectionClosedBusy

Это необычно большое количество System.Reflection.RuntimeMethodInfo объектов?

  • На сервере имеется 49 сайтов, работающих в одном пуле приложений.
  • Все сайты идентичны (каждый из них является ребрендинговым сайтом)
  • Двоичные файлы в папке /bin каждого сайта идентичны
  • Сервер работает под управлением Windows 2003 32bit Standard SP2
  • Приложение написано в ASP.NET 2.0 (веб-формы, а не MVC)
  • .NET 2.0 полностью исправлен для SP2 (через обновление .NET 3.5 SP1).
  • Размер файла подкачки увеличен до 4 ГБ (рекомендуется, чтобы я где-то читал)
  • Приложение использует пакет управления Infragistics Web (v10.2):

    Infragistics35.Web.v10.2.dll
    Infragistics35.WebUI.Shared.v10.2.dll
    Infragistics35.WebUI.UltraWebGrid.v10.2.dll
    Infragistics35.WebUI.UltraWebTab.v10.2.dll
    Infragistics35.WebUI.WebDataInput.v10.2.dll

Симптомы - это «Недостаточно памяти», когда мы видим, что виртуальные байты для процесса достигают ~ 2 ГБ, а частные байты - около 900 МБ.

На сервере установлен <deployment retail="true" /> configured in machine.config`.

Сборки являются сборками выпуска и набор debug="false настроен в разделе <compilation/>.

Любой совет будет полезен.

1 Ответ

2 голосов
/ 07 ноября 2010

Чтобы ответить на ваш первый вопрос, слабые ссылки используются для хранения ссылки на объект, не предотвращая сборку мусора этим объектом.В этом случае кажется, что они поддерживают список всех экземпляров класса Server.Такой список должен был бы использовать слабые ссылки, потому что иначе ни один экземпляр этого класса никогда не будет удален после создания, если только он не был удален из этого списка первым.То, что они используют в этом списке экземпляров, я не могу сказать, не видя остальной код, но они могли бы выполнять какое-то кэширование или пул соединений (хотя последнее будет плохо, потому что ado.net уже делает это для вас).

Кроме того, знайте, что сами слабые ссылки являются объектами, и поэтому, если ссылки, которые больше не ссылаются на живой объект, будут удалены из списка, они вызовут утечку памяти.Однако они являются небольшими объектами и вряд ли вызовут проблему, если не будет создано большое количество экземпляров Сервера.

Что касается вашего второго вопроса, я не знаю, сколько объектов MethodInfo для этого нормально.тип среды.Однако я помню, как читал во времена .Net 2.0, что объекты отражения никогда не выгружаются после того, как они были запрошены в данном домене приложения.Насколько я знаю, это не изменилось.Но, поскольку среда выполнения будет создавать не более одного такого объекта для каждого уникального метода, это вряд ли будет проблемой, если они не используют какую-то генерацию кода во время выполнения.В противном случае максимальное количество таких объектов, которые могут быть созданы, будет ограничено количеством методов в сборках, используемых приложением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...