(WeakReference )弱引用解决OutOfMemoryException异常_内存

使用WeakReference 来释放那些长时间在内存中无用的大对象

测试代码:

 


(WeakReference )弱引用解决OutOfMemoryException异常_C#_02(WeakReference )弱引用解决OutOfMemoryException异常_i++_03View 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;
}
}
}