MemoryStream.SetLength (0) и MemoryStream.Capacity = 0 не очищают использованную память - PullRequest
2 голосов
/ 06 августа 2011

У меня есть программа для потоковой передачи мультимедиа, которая создает два огромных MemoryStreams, а затем должна обнулить их по завершении. Проблема в том, что память не восстанавливается после того, как я вызову ОБА MemoryStream.SetLength (0); и MemoryStream.Capacity = 0. GC.Collect (), кажется, решает проблему, но я слышал, что это плохая практика программирования, потому что это приводит к зависанию всех потоков в приложении; хотя зависание потоков не будет проблемой в течение короткого времени, которое потребуется для очистки памяти. Тем не менее, было бы неплохо, если бы существовал другой способ решения проблемы. Есть предложения?

Ответы [ 4 ]

5 голосов
/ 06 августа 2011

GC.Collect (), кажется, решает проблему

Так что нет проблем ... Почему вы думаете, что нужно заставить GC собирать память сразу?Это будет сделано, когда система сочтет это необходимым.Не пытайтесь перехитрить GC;)

0 голосов
/ 06 августа 2011

Можете ли вы позвонить утилизировать на потоках памяти?В противном случае я бы сказал, что если перфект не является неприемлемым, когда вы делаете gc.collect, продолжайте делать это.У нас была похожая ситуация, когда клиент нашел объяснение «пусть gc делает свое дело» неприемлемо.Esp, если это не вредит, делай то, что хочет клиент.

0 голосов
/ 06 августа 2011

Если вам действительно требуется ручное управление памятью, используйте UnmanagedMemoryStream с памятью, выделенной чем-то вроде Marshal.AllocHGlobal.

0 голосов
/ 06 августа 2011

Вы можете просто заполнить память нулями с помощью метода Write, затем вызвать Flush, а затем вызвать метод MemoryStream Close или Dispose, если вы беспокоитесь, что данные, оставшиеся в потоке, останутся в памяти после его удаления. (Да, это будет медленнее для огромных потоков памяти, но вы должны быть обеспокоены этим только после определения с помощью профилирования, вызывает ли это реальную проблему производительности в вашей программе.)

...