高级语言的内存问题

最近做的事情比较杂,感觉稍微有意义一点的就是解决了项目里碰到的一个莫名其妙的内存爆炸问题。环境是windows下,C#语言,大量的Mat重复使用,然后运行到一定时间后总是报错,主要就是OpenCV u!=0这种错。

报错通常发生在程序后期,然后确保所有Mat都用完release,然后也不是发生在内存占用100%的时候。这个调试真的超级麻烦,关键是实验一次,时间成本太大,后来逐渐定位到了内存使用问题。

解决手段

比较高频率(程序中是每50次处理)执行内存手动回收函数

GC.collect()

一开始我是在内存占用超过一定数值之后才使用这个函数,发现即使内存占用控制在50%(32GB/64GB)以下,还是会出现报错,后来变更为每一定次数执行内存回收。

原理

高级语言自己有一套内存回收机制,每过一段时间自动会回收那些不在引用的对象,这是为了不频繁的进行内存回收,这样可以提高程序执行的效率。这是非常好的一个机制,但是在这种情况下就是这个机制导致的报错,所以需要通过手动进行内存回收来解决这个问题。

至于为什么会在内存还没有100%的时候就报错,我就不知道了,可能是虽然没有全部占满,但是分配我的程序执行的某些内存限制满了(猜测)。

发表回复