【问题标题】:Garbage collection of LOH, WeakReferences, large objectsLOH、WeakReferences、大对象的垃圾收集
【发布时间】:2011-03-01 16:37:49
【问题描述】:

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

【问题讨论】:

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


    【解决方案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();
    }
    

    【讨论】:

    • 我提到过,我无法确定强制垃圾收集的时间......加载下一个文件后收集内存不是一个好主意,绝对不会有延迟加载
    • 我提到你可以使用这个函数before将文件延迟加载到内存中:-)
    • GC.GetTotalMemory(true) 在下一个文件加载之前没有帮助......我仍然能够将大约 3GB 加载到内存中然后应用程序冻结
    • 我添加了一个伪实现以确保我们谈论的是同一件事。
    • 是的,我们在谈论同样的事情。我也考虑过这个解决方案,但我不想在我的应用程序(MY_THRESHOLD)中创建一个限制......实际上,我似乎找到了我的问题的根源 - 一些从weakReference.Target获得强引用的对象,不会释放它们!
    猜你喜欢
    • 2012-07-09
    • 2023-03-19
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多