(WeakReference )弱引用解决OutOfMemoryException异常

(WeakReference )弱引用解决OutOfMemoryException异常

使用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;

        }

    }

}

 

你可能感兴趣的:(WeakReference)