弱引用能否有效避免因内存不足导致的OutOfMemoryException异常发生?
- 内容介绍
- 文章标签
- 相关推荐
本文共计339个文字,预计阅读时间需要2分钟。
使用WeakReference来释放长时间在内存中无用的对象测试代码:
csharpusing System;using System.Collections.Generic;using System.WeakReference;
public class TestWeakReference{ public static void Main() { object largeObject=new object(); WeakReference weakRef=new WeakReference(largeObject);
// 检查是否可达 Console.WriteLine(Is alive: + weakRef.IsAlive);
// 强制垃圾回收 GC.Collect();
// 再次检查是否可达 Console.WriteLine(Is alive after GC: + weakRef.IsAlive); }}
使用WeakReference来释放那些长时间在内存中无用的大对象测试代码:ViewCodeusingSystem;usingSystem.Collections.Generic使用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;}}}
本文共计339个文字,预计阅读时间需要2分钟。
使用WeakReference来释放长时间在内存中无用的对象测试代码:
csharpusing System;using System.Collections.Generic;using System.WeakReference;
public class TestWeakReference{ public static void Main() { object largeObject=new object(); WeakReference weakRef=new WeakReference(largeObject);
// 检查是否可达 Console.WriteLine(Is alive: + weakRef.IsAlive);
// 强制垃圾回收 GC.Collect();
// 再次检查是否可达 Console.WriteLine(Is alive after GC: + weakRef.IsAlive); }}
使用WeakReference来释放那些长时间在内存中无用的大对象测试代码:ViewCodeusingSystem;usingSystem.Collections.Generic使用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;}}}

