Сборка мусора LOH, WeakReferences, крупные объекты - PullRequest
3 голосов
/ 01 марта 2011

В моем приложении мне нужно загрузить в память большие файлы (может быть ~ 250 МБ), я делаю это лениво - когда пользователь просит посмотреть файл - я загружаю его.После этого каждый раз, когда пользователь пытается получить доступ к файлу, я могу показать его немедленно, потому что он уже находится в памяти.Итак, проблема в сборке мусора ... Каждый файл, который я загружаю, я загружаю через WeakReference, НО: я тестировал его несколько раз, я смог загрузить около 3 ГБ в память (чем приложение стало недоступным для использования), но GC не произошло.Я не могу вызвать GC.Collect (2), потому что я не могу определить время для его вызова, так как сказать GC собирать память (слабые ссылки) в хорошие моменты (блин, 3 ГБ это слишком много ... Кажется,ГК просто не выполняет свою работу) Горячо ее решить?Мне действительно нужна отложенная загрузка, но мне нужно собирать память, когда процесс использует более 1 ГБ или что-то в этом роде

1 Ответ

1 голос
/ 01 марта 2011

Статическая функция называется GC.GetTotalMemory(bool forceFullCollection) (http://msdn.microsoft.com/en-us/library/system.gc.gettotalmemory.aspx).Вы можете использовать его для принудительного сбора мусора перед загрузкой нового файла в память, если вы преодолели какой-то порог.

Редактировать: возможная реализация

public MyFile GetMyFile(){
   if ( !is_my_file_in_memory() ) {
      if (CG.GetTotalMemory(false) > MY_THRESHOLD ) {

        GC.Collect(2);

      }
      load_my_file_in_memory();
   }
   return get_my_file_from_memory();
}
...