2016-08-31 5 views
0

私はXY問題があります。私は現在、Y自体で何が起こっているのかを学び、理解しようとしています。私のシナリオを再現するには、このコード(およびSystem.Webの4.0参照)で新しいコンソールアプリケーションを作成します。もう一度SessionStateItemCollectionで予期しないOutOfMemoryExceptionがデシリアライズ

var badData = new byte[] { 66, 97, 100, 32, 68, 97, 116, 97 }; 

using (var ms = new MemoryStream(badData)) 
using (var br = new BinaryReader(ms)) 
{ 
    var item = SessionStateItemCollection.Deserialize(br); // <-- OOMException here 
} 

Console.ReadKey(); 

、私はこのコードであらゆる種類の問題があり、実現が、私は行く前にXに戻って実際の問題を修正し始めたら、を理解してを理解して、なぜOutOfMemoryExceptionになるのかを知りたいです。

私は自分の疑問に答えようとしましたが、最初は常識的でしたが、このコードが多くのメモリを消費する理由はないと思いますか?

public ArrayList(int capacity) { 
    if (capacity < 0) throw new ArgumentOutOfRangeException("capacity", Environment.GetResourceString("ArgumentOutOfRange_MustBeNonNegNum", "capacity")); 
    Contract.EndContractBlock(); 

    if (capacity == 0) 
     _items = emptyArray; 
    else 
     _items = new Object[capacity]; 
} 
mscorlib.dll!System.Collections.ArrayList.ArrayList(int capacity) + 0x1f bytes  
System.dll!System.Collections.Specialized.NameObjectCollectionBase.Reset(int capacity) + 0x21 bytes 
System.Web.dll!System.Web.SessionState.SessionStateItemCollection.Deserialize(System.IO.BinaryReader reader) + 0x75 bytes 
ConsoleApplication1.exe!ConsoleApplication1.Program.Main(string[] args) Line 20 + 0x9 bytes C# 

は、だから私はこのコードで the source of System.Collections.ArrayList's relevant constructorをチェックアウト:私は、コールスタックを見て、私の質問に答えることを試みたので、次の

それはではないOutOfMemoryExceptionを投げる。

それにもかかわらず(そのコールスタックで)その例外が発生するのはなぜですか?

答えて

1

あなたはSessionStateItemCollection.Deserializeメソッドに見れば次のコードを見つけます。このオブジェクトのシリアル化された自然のため、次

int count = reader.ReadInt32(); 
... 
new SessionStateItemCollection.KeyedCollection(count) 

あなたのケース数は543449410に等しいでは、これは、メモリの2 GB以上であります1つのチャンク。

関連する問題