在.NET等多線程環境下,我通常儘量避免創建佔用更多內存的連續內存塊,因爲這可能會導致內存問題。可以在不沖洗的情況下連續寫入流,並將其內容強制到大對象堆上?
我的一位開發人員正在使用一個循環來寫入Response
。 OutputStream
,沒有Flush
ing,除了在循環結束時。
我正確地認爲在循環中不是Flush
會導致內存問題嗎?我怎麼能證明這一點?
在.NET等多線程環境下,我通常儘量避免創建佔用更多內存的連續內存塊,因爲這可能會導致內存問題。可以在不沖洗的情況下連續寫入流,並將其內容強制到大對象堆上?
我的一位開發人員正在使用一個循環來寫入Response
。 OutputStream
,沒有Flush
ing,除了在循環結束時。
我正確地認爲在循環中不是Flush
會導致內存問題嗎?我怎麼能證明這一點?
這取決於正在使用的流的實現細節。從上Stream base class
在MSDN文檔流是字節,諸如文件,輸入/輸出設備,進程間通信管道,或TCP/IP套接字的序列的抽象。 Stream類及其派生類提供了這些不同類型的輸入和輸出的通用視圖,並將程序員與操作系統和底層設備的具體細節隔離。
如果該流的implementator沒有留下關於如何處理與多個後續Write
調用任何額外的指導,我們應該假定它處理那些細節沖洗你。
我假設你覺得這個答案有點令人失望,所以挖得更深一點。正如你所說你的同事正在使用Response.OutputStream
讓我們看看該屬性的底層實現是什麼。
get
{
if (!this.UsingHttpWriter)
{
throw new HttpException(SR.GetString("OutputStream_NotAvail"));
}
return this._httpWriter.OutputStream;
}
因此,它是利用東西Stream
在_httpWriter
。該字段證明存在對HttpWriter
的實例的引用。它OutputStream
財產得到初始化在構造函數中:
this._stream = new HttpResponseStream(this);
類HttpResponseStream
是內部的,但我們可以用ILSpy來撬開它。它Write
方法推遲實施回到這個HttpWriter的方法:
internal void WriteFromStream(byte[] data, int offset, int size)
{
if (this._charBufferLength != this._charBufferFree)
{
this.FlushCharBuffer(true);
}
this.BufferData(data, offset, size, true);
if (!this._responseBufferingOn)
{
this._response.Flush();
}
}
正如你所看到的字節[]數據被傳遞給還進一步複製和存儲與幫助HttpResponseUnmanagedBufferElement
其複製字節的數據的方法以Marshal.Copy
存儲到非託管內存的緩衝區。該內存似乎分配在一個集成管道中大約16K的區塊,其餘的大約31K。因此,我不希望Stream分配太多的內存,以至於內部結構在LOH上結束,因爲從外觀上看,它只會產生託管 - >非託管內存副本。
留下您的想法,我們定期在循環中調用Flush
。該HttpResponseStream
有這樣實現:
public override void Flush()
{
this._writer.Flush();
}
其中_writer
是較早發現HttpWriter
。它的實現是
public override void Flush()
{
}
這是正確的,調用flush只會浪費CPU週期。儘管有前途的documentation in MSDN,但它不會幫助該流盡快清除緩衝區。
看來你是正確的:http://referencesource.microsoft.com/#System.Web/HttpWriter.cs,0373c8927b6c5833 - Flush沒有做什麼有趣。謝謝! – user420667