使用WeakReference 来释放那些长时间在内存中无用的大对象
测试代码:
View Code
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Runtime.Serialization.Formatters.Binary; namespace WeakReferenceTestSample { public class SomeBigClass : List<string> { public SomeBigClass() { //this.LoadBigObject(); this.LoadWeakReferenceBigObject(); } private void LoadBigObject() { var smallBlockSize = 90000; var largeBlockSize = 1 << 24; var count = 0; var bigBlock = new byte[0]; //for (int i = 0; i < 100000; i++) // this.Add(string.Format("String No. {0}", i)); try { var smallBlocks = new List<byte[]>(); while (true) { GC.Collect(); bigBlock = new byte[largeBlockSize]; largeBlockSize++; smallBlocks.Add(new byte[smallBlockSize]); count++; Console.WriteLine("{0} {1}", count.ToString(), ObjectSize(smallBlocks).ToString()); } } catch (OutOfMemoryException) { bigBlock = null; GC.Collect(); Console.WriteLine("{0} Mb allocated", (count*smallBlockSize)/(1024*1024)); } } private void LoadWeakReferenceBigObject() { var smallBlockSize = 90000; var largeBlockSize = 1 << 24; var count = 0; //var bigBlock = new byte[0]; var bigBlock = new WeakReference(new byte[0]); try { //var smallBlocks = new List<byte[]>(); var smallBlocks = new List<WeakReference>(); while (true) { GC.Collect(); bigBlock = new WeakReference(new byte[largeBlockSize]); largeBlockSize++; smallBlocks.Add(new WeakReference(new byte[smallBlockSize])); count++; Console.WriteLine("{0} {1}", count.ToString(), ObjectSize(smallBlocks).ToString()); } } catch (OutOfMemoryException) { bigBlock = null; GC.Collect(); Console.WriteLine("{0} Mb allocated", (count * smallBlockSize) / (1024 * 1024)); } } private long ObjectSize(object o) { long size = 0; //object o = new object(); using (Stream s = new MemoryStream()) { BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(s, o); size = s.Length; } return size; } } }