C# 频繁申请数组偶尔报错OutOfMemoryException
如图, 频繁申请新的数组,导致偶尔报错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相关推荐
- mongodb偶尔报错com.mongodb.MongoSocketReadException: Prematurely reached end of stream
项目开发中,链接mongodb的项目,偶尔报错com.mongodb.MongoSocketReadException: Prematurely reached end of stream 报错的详细 ...
- php访问数组用引号_php双引号中访问数组元素报错如何解决
最近在做微信公众号开发,在一个发送图文接口中,需要把数组元素拼接在XML字符串中,本文主要和大家分享一篇基于php双引号中访问数组元素报错的解决方法,具有很好的参考价值,希望对大家有所帮助.一起跟随小 ...
- Android已申请动态权限报错,Android 读取或者写入U盘时,报错:Permission denied
** 以下所有操作的前提是: android 系统已经root ** 最近在将文件拷贝到U盘时总是 写入失败(Permission denied) 程序清单中已经加入了权限 并且动态申请了权限 pri ...
- was6.1偶尔报错com.ibm.websphere.ce.cm.StaleConnectionException
在was6.1上部署一个web应用,使用Oracle10g数据库,使用连接池方式连接数据库,使用quartz跑自动任务,它就偶尔报下面的错误,请教各位大师如何解决,急急急!!!如下时报错代码: com ...
- fastadmin使用fast\Http 发送post/get/patch等请求,参数为二维数组时候报错,怎么解决?
之前受邀回答了这么一个问题: 在后端发请求时,如果参数里面是数组,就会报错"Array to string conversion",大概意思就是数组转字符串的时候出错了. 先说解决 ...
- c语言给数组赋值 报错,请教为什么给数组赋值会报错
请问为什么给数组赋值会报错? 请问为什么info[index][0]=str;这种赋值语句总是会报错呢? 请高手指教,非常感谢!! #include #include #include int sys ...
- 申请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 如 ...
- vue中通过arr.length获取数组长度报错:Error in render: “TypeError: Cannot read property ‘length‘ of undefined“
刚开始是通过arr.length获取数组长度的! 结果控制台报错: Error in render: "TypeError: Cannot read property 'length' of ...
- 微信小程序数组push报错
不知道你的报错是啥场景 我的情况是vx:for一组view标签 绑定点击事件 添加自定义数组 点击时候要把此标签的自定义属性值添加到一个新数组 这是正确的写法 错误的写法是你直接在setData里 ...
最新文章
- iOS进阶之架构设计MVVM模式实践(11)
- 百度网络监控实战:NetRadar横空出世(上)
- legend3---Homestead中Laravel项目502 Bad Gateway
- .NET (c#)序列化和反序列化
- 专访腾讯产品总监邬沛君:TStack斩获OSCAR技术创新奖的背后
- 学习Vue电商后台管理系统剩余功能模块的bug
- JavaScript -- Map数据结构
- 最强大脑记忆曲线(6)——字词录入页设计
- 计算机网络之网络层- IPv4编址
- 苹果4S恢复模式 一直正在等待iphone解决办法
- 明翰英语教学系列之语料篇V0.4(持续更新)
- Paper:人工智能可解释性的背景/方法/伦理/教育/可解释性的基本原理/Interpretability和Explainability区别之《可解释人工智能的教育视角:基于伦理和素养的思考》解读笔记
- 职场健康:久坐不动最伤五部位 简单动作可有效改善
- 《乡村爱情6》七月宾县开机
- 材料学转计算机科学,科学网-[转载]【计算机科学】【2018.12】基于深度学习技术的材料识别-刘春静的博文...
- VLC 0.1.99 源码分析
- Nginx介绍及配置 (一)
- 【交通标志识别】基于SIFT特征实现交通标志识别matlab代码
- 微信小程序登录功能的前端设计与实现
- java-net-php-python-springboot区校企大型仪器智慧共享平台计算机毕业设计程序