Установка частного поля на null
может быть полезна, когда класс, содержащий это поле, все еще будет использоваться. Это позволит собирать указанный объект. Однако, когда на этот экземпляр этого частного поля нет ссылок, то будет и объект, на который он ссылается. Другими словами, бесполезно обнулять закрытые поля в объекте, на который скоро не ссылаются.
Я думаю, что у вас нет утечки приложений. Возможно, вы создаете строки, которые хранятся в куче больших объектов (LOH). Объекты хранятся в LOH, если они больше или равны 85000 байтов (с 42492 символами или более). LOH собирается только тогда, когда происходит полный сбор мусора (поколение 2). Поэтому, поскольку у вас, похоже, нет никаких OutOfMemoryExceptions
, я не думаю, что есть утечка. Вашему приложению просто не хватает памяти, а GC просто не собирает Gen2.
Вы можете проверить это, позвонив по номеру GC.Collect()
. Это удалит все неиспользуемые крупные объекты.
<ч />
Таким образом, хотя в вашем приложении, вероятно, нет утечки, объем памяти может быть нежелательным большим. Особенно, когда вы пишете настольное приложение, которое не является единственным приложением, запрашивающим память. Помимо этого, большая куча памяти также может вызвать проблемы с производительностью, потому что GC должен работать чаще.
Возможно, возможно реорганизовать ваш код так, чтобы он занимал меньше памяти. Например, использование StringBuilder
объектов (если вы этого еще не сделали). Или, может быть, даже кэшировать StringBuilder
объекты в пуле и использовать их вместо создания нового. Особенно при установке свойства Capacity при использовании экземпляра, полученного из пула. Это может быть особенно полезно, потому что LOH имеет тенденцию легко фрагментироваться, что может вызвать OutOfMemoryExceptions
. Между прочим, это проблема только в 32-битных системах, поскольку 64-битные системы имеют практически неограниченное виртуальное адресное пространство. В ближайшие годы 64-битная среда станет все более популярной, и я полагаю, что Microsoft не вкладывала средства в решение этой проблемы в 32-битных версиях CLR.
Обновление
В случае взаимодействия строки сериализуются и десериализуются. Строка передается в виде байтового массива, поэтому в общем случае она не изменяется, сохраняя ссылки. Однако каждый раз, когда вы извлекаете строку из взаимодействия, создается новый байтовый массив, и в .NET этот byte [] копируется в строку. Это удвоит объем используемой памяти.