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

时间:2014-05-16 05:58:06

标签: 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
   }
 }

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

1 个答案:

答案 0 :(得分:1)

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