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