使用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{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();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();var smallBlocks new List();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;}}}