Объект не собрал "мусор", но не содержит gcroots

Кроме того, есть также str_match , которые будут возвращать совпадающие группы внутри регулярного выражения:

str_match(url, "://(.*?)/(.*?)(\/|$)")[,2]

13
задан Lachmania 2 March 2009 в 19:16
поделиться

7 ответов

Вы могли попытаться использовать 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
4
ответ дан 2 December 2019 в 01:11
поделиться

Немного вещей:

  1. GC.Collect не поможет Вам сделать любую отладку. Сборщик "мусора" уже называют: если бы какие-либо объекты были доступны для набора, это уже произошло бы.
  2. Неактивная память на сервере является потраченной впустую памятью. Вы - верная память, 'пропускается' или это просто, что платформа решает, что это может сохранить больше вещей в memroy или сохранить больше памяти вокруг для более быстрого доступа? В этом случае я подозреваю, что Вы пропускаете память, но это - что-то для проверения дважды для.
  3. Это походит на что-то, что Вы не ожидаете, сохраняет ссылку на объекты PaymentOption. Возможно, статический набор где-нибудь? Или отдельный поток?
2
ответ дан 2 December 2019 в 01:11
поделиться

Не без большего количества информации о Вашем приложении. Но мы столкнулись с некоторыми противными проблемами памяти давным-давно. Вы используете кэширование ASP.NET? Поскольку Raymond Chen нравится говорить, "плохая стратегия кэширования indisitinguishable от утечки памяти".

Проверьте другой инструмент - CLRProfiler.exe - он поможет Вам пересечь деревья ссылки на объект для наблюдения, где объекты базированы. Это также хорошо: текст ссылки

Вы услышали это прежде - если Вы имеете к GC.Collect, что-то неправильно.

1
ответ дан 2 December 2019 в 01:11
поделиться

PaymentOption является объектом, созданным в асинхронном процессе, случайно? Я помню что-то о, если Вы не называете EndInvoke, можно получить проблемы как это.

1
ответ дан 2 December 2019 в 01:11
поделиться

Я сам исследовал ту же проблему и спрашивал, почему не собираются объекты, на которые не было ссылок.

Объекты размером более 85 000 байт хранятся в куче больших объектов из какая память освобождается реже.

http://msdn.microsoft.com/en-us/magazine/cc534993.aspx

Один параметр PaymentOption может быть не таким большим, но содержатся ли они в коллекциях или они основаны на чем-то вроде DataSet? Вам следует выбрать несколько экземпляров PaymentOption / collection / DataSet, а затем использовать команду sos! Objsize, чтобы увидеть, насколько они велики.

К сожалению, это не совсем ответ на вопрос. Мне нравится думать, что я могу доверять структуре .net, которая позаботится об освобождении неиспользуемой памяти, когда это необходимо.

1
ответ дан 2 December 2019 в 01:11
поделиться

Реализует ли 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 могут указывать в правильном направлении.

2
ответ дан 2 December 2019 в 01:11
поделиться

К вашему сведению, SOS в .NET 4 поддерживает несколько новых команд, которые могут оказаться полезными, а именно ! Gcwhere (найдите поколение возражение; gcgen от sosex) и ! findroots (делает то, что написано; ссылки sosex!)

Оба задокументированы в документации SOS и , упомянутых на Блог Тесс Феррандес .

0
ответ дан 2 December 2019 в 01:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: