LOH,WeakReferences,大型对象的垃圾收集

时间:2011-03-01 16:37:50

标签: c# garbage-collection weak-references large-object-heap

在我的应用程序中,我需要将大文件(大约约250 MB)加载到内存中,我是以懒惰的方式进行 - 当用户要求查看文件时 - 我正在加载它。之后,每次用户尝试访问该文件时,我都能立即显示它,因为它已经位于内存中。 所以,问题在于垃圾收集...... 我正在加载的每个文件,我通过WeakReference加载, 但是: 我测试了几次,我能够将大约3GB加载到内存中(比app变得不可用),但GC没有发生。我无法调用GC.Collect(2),因为我无法确定调用它的时间,所以如何告诉GC在好时刻收集内存(弱引用)(该死的,3GB太多了......似乎GC只是不做他的工作) 热解决吗?我真的需要延迟加载,但是当进程使用超过1GB的内容时,我需要收集内存,或类似的东西

1 个答案:

答案 0 :(得分:1)

有一个名为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();
}