Я пытаюсь разобраться в том, что кажется утечкой памяти в приложении VB.NET клиента VB.NET (мы не писали код).Почему этот класс должен отслеживать слабые ссылки?
Две вещи выскочить на меня:
Они имеют узел доступа к данным с классом доступа одного данных, который, когда экземпляр пробегов этот код в конструкторе:
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 показывают, что это в сборке доступа к данным сборки выпуска.
Копаем о с 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/>
.
Любой совет будет полезен.
Спасибо за ответ. Слабое контрольное отслеживание было немного красно-селедки. Пока в памяти висели слабые объекты рефлекса, число их было минимальным. Также похоже, что этот код был артефактом какого-то более старого компонента VB.NET. Я попросил разработчика удалить только для пояса и брекетов. Казалось бы, настоящая причина заключалась в том, что в одном приложении было 49 приложений. Элементы управления infragistics не помогали, поскольку они, как правило, являются настоящими свиньями памяти. Мы разделили сайты на четыре пула приложений, и наши проблемы с давлением памяти волшебным образом разрешили сами. – Kev
Теперь мы видим пик виртуальных/частных байтов примерно в 900 МБ/600 МБ (приблизительный) для каждого пула приложений, а затем, когда сайты тихие, мы видим, что память освобождается. В любом случае спасибо за подробный ответ и +1. – Kev