zoukankan      html  css  js  c++  java
  • (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;
            }
        }
    }
  • 相关阅读:
    Android与H5互调
    在本地(自己电脑上)部署了tomcat服务器,真机测试遇到的问题
    Android项目搭建最常用的架构解密
    Android Studio插件Gsonformat的安装和使用
    如何配置tomcat环境变量
    Cannot resolve symbol KeyEventCompat(android.support.v4.view.KeyEventCompat找不到)
    CG-CTF | 上传绕过
    Codeforce |Educational Codeforces Round 77 (Rated for Div. 2) B. Obtain Two Zeroes
    滑动窗口 | 求最长连续子数组
    第四周训练 | 并查集
  • 原文地址:https://www.cnblogs.com/zeroone/p/3025667.html
Copyright © 2011-2022 走看看