如图, 频繁申请新的数组,导致偶尔报错OutOfMemoryException(重点:偶尔),很奇怪的问题,明明内存够,却报错OutOfMemoryException。

分析:数组地址是连续的,我这是图片数据,大小可能有的大,导致频繁申请新的连续地址不够,以前使用过的数组GC又没有来得及回收(大概140ms申请一次连续地址),所以报此错。

解决方案:1.直接加内存(开玩笑)

2.程序启动申请一个固定大小的内存地址,每次去覆盖此数组的值,而不去创建新的地址。

自己封装了一个类使用如下:

public class LargeArray{private readonly int _capacity;private readonly int _arraySize;private readonly byte[][] _array;private volatile int _currentIndex = 0;public LargeArray(int capacity, int arraySize){if (capacity <= 0 || arraySize <= 0)throw new Exception("大小必须大于0");this._capacity = capacity;this._arraySize = arraySize;this._array = new byte[capacity][];for (int i = 0; i < capacity; i++){this._array[i] = new byte[arraySize];}}public int ArraySize{get{return this._arraySize;}}public int Capacity{get{return this._capacity;}}public int CurrentIndex{get{return this._currentIndex;}private set{if (value == this.Capacity)value = 0;this._currentIndex = value;}}public IntPtr Pointer{set{Marshal.Copy(value, ArrayData, 0, this._arraySize);}}public byte[] ArrayData{get{return this._array[CurrentIndex];}set{this._array[CurrentIndex++] = value;}}}

这里的capacity是创建几个大小相同的数组,arraySize是每个数组的大小。

使用:

_largeArray是全局变量,最终获取数组_largeArray.ArrayData就可(注意:在使用的时候需要及时使用,因为会被后面的覆盖,如果来不及使用,可以把capacity设置大一点,最好合理的大小,太大会浪费资源) 。本例子中_largeArray.Pointer = e.Pointer将值赋值到数组,然后Data = _largeArray.ArrayData立马加入到队列等待使用,此时绘图线程可能来不及使用,但是我开启了3个,所以中间有一定的缓冲,设置capacity越大,缓冲时间越长,开销的内存资源就越多,如果来不及使用就会被覆盖,图像要么出现跳要么就出现乱。

ps:我这里创建图像线程只负责生产数组数据,不绘图,绘图在另外的线程,可能会慢点,所以我这里设置3个数组作为绘图线程的缓冲。

对比之前的图像,现在的内存反而降低了不少。。。

C# 频繁申请数组偶尔报错OutOfMemoryException相关推荐

  1. mongodb偶尔报错com.mongodb.MongoSocketReadException: Prematurely reached end of stream

    项目开发中,链接mongodb的项目,偶尔报错com.mongodb.MongoSocketReadException: Prematurely reached end of stream 报错的详细 ...

  2. php访问数组用引号_php双引号中访问数组元素报错如何解决

    最近在做微信公众号开发,在一个发送图文接口中,需要把数组元素拼接在XML字符串中,本文主要和大家分享一篇基于php双引号中访问数组元素报错的解决方法,具有很好的参考价值,希望对大家有所帮助.一起跟随小 ...

  3. Android已申请动态权限报错,Android 读取或者写入U盘时,报错:Permission denied

    ** 以下所有操作的前提是: android 系统已经root ** 最近在将文件拷贝到U盘时总是 写入失败(Permission denied) 程序清单中已经加入了权限 并且动态申请了权限 pri ...

  4. was6.1偶尔报错com.ibm.websphere.ce.cm.StaleConnectionException

    在was6.1上部署一个web应用,使用Oracle10g数据库,使用连接池方式连接数据库,使用quartz跑自动任务,它就偶尔报下面的错误,请教各位大师如何解决,急急急!!!如下时报错代码: com ...

  5. fastadmin使用fast\Http 发送post/get/patch等请求,参数为二维数组时候报错,怎么解决?

    之前受邀回答了这么一个问题: 在后端发请求时,如果参数里面是数组,就会报错"Array to string conversion",大概意思就是数组转字符串的时候出错了. 先说解决 ...

  6. c语言给数组赋值 报错,请教为什么给数组赋值会报错

    请问为什么给数组赋值会报错? 请问为什么info[index][0]=str;这种赋值语句总是会报错呢? 请高手指教,非常感谢!! #include #include #include int sys ...

  7. 申请Apple ID报错(Sorry,could not complete request because:application information was not supplied)

    报错: AppleConnect Sorry,could not complete request because:application information was not supplied 如 ...

  8. vue中通过arr.length获取数组长度报错:Error in render: “TypeError: Cannot read property ‘length‘ of undefined“

    刚开始是通过arr.length获取数组长度的! 结果控制台报错: Error in render: "TypeError: Cannot read property 'length' of ...

  9. 微信小程序数组push报错

    不知道你的报错是啥场景 我的情况是vx:for一组view标签 绑定点击事件  添加自定义数组  点击时候要把此标签的自定义属性值添加到一个新数组 这是正确的写法 错误的写法是你直接在setData里 ...

最新文章

  1. iOS进阶之架构设计MVVM模式实践(11)
  2. 百度网络监控实战:NetRadar横空出世(上)
  3. legend3---Homestead中Laravel项目502 Bad Gateway
  4. .NET (c#)序列化和反序列化
  5. 专访腾讯产品总监邬沛君:TStack斩获OSCAR技术创新奖的背后
  6. 学习Vue电商后台管理系统剩余功能模块的bug
  7. JavaScript -- Map数据结构
  8. 最强大脑记忆曲线(6)——字词录入页设计
  9. 计算机网络之网络层- IPv4编址
  10. 苹果4S恢复模式 一直正在等待iphone解决办法
  11. 明翰英语教学系列之语料篇V0.4(持续更新)
  12. Paper:人工智能可解释性的背景/方法/伦理/教育/可解释性的基本原理/Interpretability和Explainability区别之《可解释人工智能的教育视角:基于伦理和素养的思考》解读笔记
  13. 职场健康:久坐不动最伤五部位 简单动作可有效改善
  14. 《乡村爱情6》七月宾县开机
  15. 材料学转计算机科学,科学网-[转载]【计算机科学】【2018.12】基于深度学习技术的材料识别-刘春静的博文...
  16. VLC 0.1.99 源码分析
  17. Nginx介绍及配置 (一)
  18. 【交通标志识别】基于SIFT特征实现交通标志识别matlab代码
  19. 微信小程序登录功能的前端设计与实现
  20. java-net-php-python-springboot区校企大型仪器智慧共享平台计算机毕业设计程序

热门文章

  1. 三菱fx3u+485ADP MB与4台欧姆龙E5CC温控器通讯案例程序
  2. 安全学习篇:ARP缓存中毒攻击
  3. RabbitMQ延迟消息场景分析以及实现两种方式(SpringBoot)
  4. 如何清除IE Cache(緩存)
  5. VMware的虚拟网络编辑器,在配置的过程中没有桥接模式!
  6. chrome 新浪微博分享插件
  7. Java基础(字符串)
  8. MyBatis简单CURD
  9. 听说你很厉害,来试试这个...
  10. 一个普通青年的成长故事