Почему Silverlight пропускает память при использовании COM? - PullRequest
7 голосов
/ 19 ноября 2010

Мы обнаружили эту проблему при размещении устаревшего COM-компонента в нашем приложении Out Of Browser Silverlight, сначала подумав, что это проблема с нашим COM-компонентом.была утечка памяти, однако.Этот COM-компонент, используемый для тестирования, написан на .NET и просто отправляет события обратно в приложение Silverlight каждый раз, когда срабатывает таймер.Каждое событие содержит только одну строку.

При запуске приложения Silverlight потребление памяти процессом продолжает расти.Профилировщики не показывают увеличения управляемой памяти, что указывает на утечку в реализации среды выполнения Silverlight / COM.

Кто-нибудь еще видел эту проблему, и если да, то удалось ли обойти ее?

Редактировать: Проект репро теперь доступен на http://bitbucket.org/freed/silverlight-com-leak

Ответы [ 4 ]

1 голос
/ 23 декабря 2010

Глядя на ваш код, строка, которую вы передаете взад и вперед (11 символов + конечный ноль) = 24 байта в юникоде. В COM Automation используются BSTR, которые добавляют 4 байта для ведущего указателя (32-разрядный), и вы умножаете это на 10000, что составляет 10000 * 28 = 280000 байт.

Это означает, что каждую миллисекунду (значение таймера равно 1) вы будете выделять много памяти, а в .NET кусок 280000 байт, вероятно, будет выделяться в куче больших объектов (> 85000 байт). В результате сильного удара по LOH большую часть времени ... возникают проблемы с памятью, как показано здесь, например: Фрагментация кучи больших объектов

Возможно, тебе стоит это проверить. Одна простая вещь для тестирования - уменьшить размер вашего BigMessage. Вы также можете углубиться в WinDBG: http://blogs.msdn.com/b/tess/archive/2008/08/21/debugging-silverlight-applications-with-windbg-and-sos-dll.aspx и проверить, что на самом деле происходит под прикрытием.

0 голосов
/ 19 ноября 2010

Не знаком с Silverlight, но другой возможной причиной головной боли при взаимодействии является обработка событий: http://www.codeproject.com/KB/cs/LingeringCOMObjects.aspx

0 голосов
/ 19 ноября 2010

Может быть, есть нативные ресурсы, а не сборщик мусора? Возможно, это один из очень немногих случаев, когда вызов GC.Collect может быть полезным. Интересное чтение здесь

Просто для теста вы могли бы позвонить в GC. Собрать пару (или даже три раза) и посмотреть, что произойдет (я не могу поверить, что я действительно предлагаю это ...).

0 голосов
/ 19 ноября 2010

Убедитесь, что компонент COM освобождает все строки, которые он выделяет.

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