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

C# 减少大对象堆中同一对象的多个副本,c#,garbage-collection,large-object-heap,C#,Garbage Collection,Large Object Heap,我正试图用HTTPWebRequest将一个大文件(大约30MB)的字节上传到某个服务器。问题在于,由于字节的大小超过了85000,它被存储在大对象堆(LOH)中。问题是,我的代码在LOH中创建了至少5个相同对象的实例,即使在关闭响应流之后,这些实例也没有从内存中删除。下面是导致此问题的代码段。在此代码块之前,LOH中只有一个文件实例 using (IO.Stream requestStream = webReqest.GetRequestStream()) { List<byte

我正试图用HTTPWebRequest将一个大文件(大约30MB)的字节上传到某个服务器。问题在于,由于字节的大小超过了85000,它被存储在大对象堆(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
   }
 }
使用(IO.Stream requestStream=webReqest.GetRequestStream())
{
List uploadData=新列表();
uploadData.AddRange(Encoding.UTF8.GetBytes(stringContainingHeaderInfo));
uploadData.AddRange(大文件的字节数);
byte[]fileFullData=uploadData.ToArray();
Write(fileFullData,0,fileFullData.Length);
requestStream.Close();
uploadData.Clear();
uploadData=null;
fileFullData=null;
fileEntityBytes=null;
使用(WebResponse WebResponse=webRequest.GetResponse())
{
//对回应做点什么
}
}

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

Microsoft最近在.NET 4.5.1中为GC引入了LargeObjectHeapCompactionMode。请使用以下链接,这可能会对您有所帮助:

什么样的服务器?是IIS吗?是的@RobertHarvey我正在尝试将其上载到一个SharePoint网站,该网站将在IIS上运行。既然您已经在使用流-为什么不在整个过程中使用流和小的固定大小的缓冲区,而不是将所有数据加载到
字节[]
?此外,执行
上载数据.Clear()也没有任何价值;uploadData=null;fileFullData=null;fileEntityBytes=null@Damien\u不相信的人应该被转化为答案。Thnx获取信息。这无疑是微软的一个有用的补充。然而,这应该作为最后手段。甚至微软也发出警告说“LOH压缩可能是一项昂贵的操作,只有在进行了重要的性能分析后才能使用,这既可以确定LOH碎片是一个问题,也可以决定何时请求压缩。”因此,更好的选择是尽可能尝试并避免它。这就是我在这里要求减少LOH中的重复条目。如果LOH中的副本较少,则不会出现碎片问题。