多线程实时处理图片信息的时候会产生大量的内存碎片,随着时间的推移导致系统处理图片的能力越来越慢,请问各位大侠,在.net中 如何对大对象堆进行碎片整理
可以用C#的指针来做这件事情,然后自己来做内存释放。
或者你将你的资源及时的释放,就是将用完的对象赋值为null 这是通知系统要对这个对象进行垃圾回收。
这样干是可行的,但是我觉得有点蛋疼,整理的时候锁定相应的资源对实时也是一种干扰,效率也是个问题。
如果能够开放一个temp区域直接用成熟的整理组件会方便不少,毕竞整理碎片的设计也是很复杂的。
@今昭: 呵呵,者是解决问题之道,不能依赖系统的GC的。
用GC,你看看這個GC中的方法,可以指定的讀取到該類所分配的區段,然後用GC,直接清除這個段的這個對象。
GC 中的方法,可以指定對象回收。如果一個 大對象,在執行完了后,可以立即,進行指定對象的清理。
@無限遐想: 不知道他的图片处理是不是在.net上跑的,如果不是gc就发挥不了作用,如果是的那gc的频繁调用效率就更差了。
个人觉得跟GC关系不大,你可以先试试代码指定回收,并且确定回收完成后再继续处理:
GC.WaitForPendingFinalizers()
更有可能的原因是你在处理图片过程中有非托管资源没有释放,确保你所有使用到了非托管资源的类都正确实现了IDisposable接口,并且Dispose()被正确调用了。否则内存泄漏了,你再怎么GC都没用的。
大对象堆是不能进行碎片整理的,你要仔细看下你的程序是不是有什么地方内存泄漏,导致GC回收不了。
最直接的办法是用windbg看下运行时都是什么东西占用了内存,什么进程占用了cpu。
关注,学习!