Как освободить виртуальную память? - PullRequest
2 голосов
/ 03 июня 2010

У меня есть приложение для поиска (с C #), которое загружает страницы из Интернета.Приложение занимает больше виртуальной памяти, даже я распоряжаюсь каждым объектом и даже использую GC.Collect() .

Это, имеет 10 потоков, и каждый поток имеет сокет, который загружает страницы.В каждой теме у меня есть byte[] buffer, в котором хранится содержимое страницы, и string str_content, в котором я храню содержимое страницы в строке.У меня есть Sytem.Timer, что каждые 3 секунды проверяют, если каждый поток был остановлен, назначьте ему новый поток и запустите его.

Я использую метод dispose и даже использую GC.Collect() в моем приложении, но в 3Час моего приложения занимает 500 МБ на виртуальной памяти (500 МБ на частных байтах в Process Explorer).Тогда моя система будет зависать, и я должен перезагрузить мой компьютер.

  1. будет ли это грубым, если я назначу мои byte[] и string на ноль?

  2. Есть ли способ освободить виртуальную память?

Спасибо.

Ответы [ 3 ]

6 голосов
/ 03 июня 2010

Прежде всего, вы не ДОЛЖНЫ вызывать gc.collect () в любом случае, так как это дорогостоящий вызов, и в этом нет необходимости.

Если вы видите рост И вы все еще звоните gc.collect(), у вас есть ресурсы, у которых все еще есть ссылки, поэтому они не могут быть собраны.

Я бы начал смотреть на ваш код и удостовериться, что все ваши объекты объявлены в правильной области, что вы используете синтаксис Using Statement, чтобы убедиться, что элементы, реализующие IDisposable, должным образом очищены и сделайте полный обзор ваших код.

Следующим шагом будет использование такого инструмента, как профилировщик ANTS или тому подобное, и просмотр того, что на самом деле хранится в памяти.

3 голосов
/ 03 июня 2010

В C # (и в Java), если у вас есть ссылка на объект, программная среда предполагает, что вы все еще используете объект. Призывы к свободной памяти освободят только неиспользуемые объекты. Ключ должен прекратить использование объекта.

Коэффициенты отличные, у вас есть что-то вроде:

Object mine = new Object();

ключ в том, что вам также нужно что-то вроде:

mine = null;

, чтобы указать, что «мой» объект больше не используется. Обычно такие проблемы не возникают в таких блоках кода, потому что после того, как вы покинете блок, переменные больше не доступны:

public void process() {
  Object mine = new Object();
}

Обычно такие проблемы возникают в таких блоках кода, потому что коллекция накапливает объекты с течением времени:

static List tasks = new ArrayList();

public void process(String item) {
  tasks.add(item);
}

Ключ в том, что без соответствующего tasks.remove(item) список будет содержать ссылки на элементы, навсегда мешающие работе по сбору мусора.

3 голосов
/ 03 июня 2010

Потребовалось бы изучить ваш код, чтобы увидеть утечки памяти. Вероятно, в событиях, к которым вы привязываетесь (вручную или автоматически), что приводит к тому, что объекты, выходящие за рамки видимости, не удаляются должным образом.

...