c# - 减少大对象堆中同一个对象的多个副本

标签 c# garbage-collection large-object-heap

我正在尝试使用 HTTPWebRequest 将一个大文件(大约 30MB)的字节上传到某个服务器。问题在于,由于字节大小超过 85000,它被存储在 LargeObjectHeap(LOH)中。问题是我的代码在 LOH 中创建了至少 5 个相同对象的实例,即使在关闭响应流之后也没有从内存中删除这些实例。以下是导致此问题的代码片段。在此代码块之前,LOH 中只有一个文件实例。

using (IO.Stream requestStream = webReqest.GetRequestStream())
{
    List<byte> uploadData = new List<byte>();
    uploadData.AddRange(Encoding.UTF8.GetBytes(stringContainingHeaderInfo));
    uploadData.AddRange(bytesOfTheLargeFile);

    byte[] fileFullData = uploadData.ToArray();
    requestStream.Write(fileFullData, 0, fileFullData.Length);
    requestStream.Close();

    uploadData.Clear();
    uploadData = null;
    fileFullData = null;
    fileEntityBytes = null;

   using (WebResponse webResponse = webRequest.GetResponse())
   {
      //Do Something with the response
   }
 }

有没有办法进一步优化此代码块,以便在堆中创建更少的副本。

最佳答案

Microsoft 最近在 .NET 4.5.1 中为 GC 引入了 LargeObjectHeapCompactionMode 请使用以下链接,这可能对您有所帮助: http://msdn.microsoft.com/en-us/library/system.runtime.gcsettings.largeobjectheapcompactionmode(v=vs.110).aspx

关于c# - 减少大对象堆中同一个对象的多个副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23693529/

相关文章:

c# - 大对象堆碎片,数组问题

c# - 如何使用文本框在数据 GridView 中搜索数据?

c# - 格式化 double 只显示 4 位数字

c# - 统一: What is Unity Measurements?

.net - GC 是否暂停当前/所有进程?

c# - 内存不足异常,即使似乎有足够的内存可用

c# - IEqualityComparer 使用字符串列表作为比较器

c++ - gcc 4.8.1 是否支持 C++11 垃圾回收?

.net - 检测是否调用了垃圾收集器(.Net)