Кроме того, есть также str_match
, которые будут возвращать совпадающие группы внутри регулярного выражения:
str_match(url, "://(.*?)/(.*?)(\/|$)")[,2]
Вы могли попытаться использовать sosex.dll в Windbg, который является расширением, записанным для помощи с отладкой.NET. Существует названная команда! судьи, который подобен! gcroot, в котором это покажет Вам все объекты, ссылающиеся на объект, плюс он покажет все объекты, что это также ссылается.
В примере на веб-сайте автора! судьи используются против объекта, и вывод похож на это:
0:000> !refs 0000000080000db8
Objects referenced by 0000000080000db8 (System.Threading.Mutex):
0000000080000ef0 32 Microsoft.Win32.SafeHandles.SafeWaitHandle
Objects referencing 0000000080000db8 (System.Threading.Mutex):
0000000080000e08 72 System.Threading.Mutex+<>c__DisplayClass3
0000000080000e50 64 System.Runtime.CompilerServices.RuntimeHelpers+CleanupCode
Немного вещей:
Не без большего количества информации о Вашем приложении. Но мы столкнулись с некоторыми противными проблемами памяти давным-давно. Вы используете кэширование ASP.NET? Поскольку Raymond Chen нравится говорить, "плохая стратегия кэширования indisitinguishable от утечки памяти".
Проверьте другой инструмент - CLRProfiler.exe - он поможет Вам пересечь деревья ссылки на объект для наблюдения, где объекты базированы. Это также хорошо: текст ссылки
Вы услышали это прежде - если Вы имеете к GC.Collect, что-то неправильно.
PaymentOption является объектом, созданным в асинхронном процессе, случайно? Я помню что-то о, если Вы не называете EndInvoke, можно получить проблемы как это.
Я сам исследовал ту же проблему и спрашивал, почему не собираются объекты, на которые не было ссылок.
Объекты размером более 85 000 байт хранятся в куче больших объектов из какая память освобождается реже.
http://msdn.microsoft.com/en-us/magazine/cc534993.aspx
Один параметр PaymentOption может быть не таким большим, но содержатся ли они в коллекциях или они основаны на чем-то вроде DataSet? Вам следует выбрать несколько экземпляров PaymentOption / collection / DataSet, а затем использовать команду sos! Objsize, чтобы увидеть, насколько они велики.
К сожалению, это не совсем ответ на вопрос. Мне нравится думать, что я могу доверять структуре .net, которая позаботится об освобождении неиспользуемой памяти, когда это необходимо.
Реализует ли PaymentObject финализатор случайно? Вызывает ли он COM-объект STA?
Мне было бы любопытно увидеть вывод! Finalizequeue, чтобы убедиться, что количество объектов, отображаемых в куче, примерно равно количеству объектов, ожидающих завершения. Результат, вероятно, должен выглядеть примерно так:
generation 0 has 57 finalizable objects (0409b5cc->0409b6b0)
generation 1 has 55 finalizable objects (0409b4f0->0409b5cc)
generation 2 has 0 finalizable objects (0409b4f0->0409b4f0)
Ready for finalization 0 objects (0409b6b0->0409b6b0)
Если количество Готовых к финализации объектов продолжает расти, и происходят ваши определенные сборки мусора (подтвердите с помощью счетчиков perfmon), то это может быть заблокированный финализатор нить. Для подтверждения вам может потребоваться сделать несколько снимков за время существования процесса (перед повторным запуском). Я обычно полагаюсь на магическое число три, пока сайт находится под какой-то нагрузкой.
Ошибка в финализаторе может заблокировать поток финализатора и предотвратить сбор объектов.
Если объект PaymentOption вызывает устаревший COM-объект STA, то эта статья вызывает исключения ASP.NET Hang и OutOfMemory. Компоненты STA могут указывать в правильном направлении.
К вашему сведению, SOS в .NET 4 поддерживает несколько новых команд, которые могут оказаться полезными, а именно ! Gcwhere
(найдите поколение возражение; gcgen от sosex) и ! findroots
(делает то, что написано; ссылки sosex!)
Оба задокументированы в документации SOS и , упомянутых на Блог Тесс Феррандес .