首页 新闻 会员 周边 捐助

.net 如何对大对象堆进行碎片整理

1
悬赏园豆:50 [已解决问题] 解决于 2012-08-30 15:59

多线程实时处理图片信息的时候会产生大量的内存碎片,随着时间的推移导致系统处理图片的能力越来越慢,请问各位大侠,在.net中 如何对大对象堆进行碎片整理

陈宪梓的主页 陈宪梓 | 初学一级 | 园豆:55
提问于:2012-03-27 09:12
< >
分享
最佳答案
1

可以用C#的指针来做这件事情,然后自己来做内存释放。

或者你将你的资源及时的释放,就是将用完的对象赋值为null 这是通知系统要对这个对象进行垃圾回收。

收获园豆:10
az235 | 大侠五级 |园豆:8483 | 2012-03-27 10:07

这样干是可行的,但是我觉得有点蛋疼,整理的时候锁定相应的资源对实时也是一种干扰,效率也是个问题。

如果能够开放一个temp区域直接用成熟的整理组件会方便不少,毕竞整理碎片的设计也是很复杂的。

today4king | 园豆:3499 (老鸟四级) | 2012-03-27 11:20

@今昭: 呵呵,者是解决问题之道,不能依赖系统的GC的。

az235 | 园豆:8483 (大侠五级) | 2012-03-27 11:57
其他回答(4)
0

用GC,你看看這個GC中的方法,可以指定的讀取到該類所分配的區段,然後用GC,直接清除這個段的這個對象。

收获园豆:10
無限遐想 | 园豆:3740 (老鸟四级) | 2012-03-27 10:15

GC 中的方法,可以指定對象回收。如果一個 大對象,在執行完了后,可以立即,進行指定對象的清理。

支持(0) 反对(0) 無限遐想 | 园豆:3740 (老鸟四级) | 2012-03-27 10:41

@無限遐想: 不知道他的图片处理是不是在.net上跑的,如果不是gc就发挥不了作用,如果是的那gc的频繁调用效率就更差了。

支持(0) 反对(0) today4king | 园豆:3499 (老鸟四级) | 2012-03-27 11:23
0

个人觉得跟GC关系不大,你可以先试试代码指定回收,并且确定回收完成后再继续处理:

GC.WaitForPendingFinalizers()

更有可能的原因是你在处理图片过程中有非托管资源没有释放,确保你所有使用到了非托管资源的类都正确实现了IDisposable接口,并且Dispose()被正确调用了。否则内存泄漏了,你再怎么GC都没用的。

收获园豆:20
水牛刀刀 | 园豆:6350 (大侠五级) | 2012-03-27 10:38
1

大对象堆是不能进行碎片整理的,你要仔细看下你的程序是不是有什么地方内存泄漏,导致GC回收不了。

最直接的办法是用windbg看下运行时都是什么东西占用了内存,什么进程占用了cpu。

收获园豆:10
玉开 | 园豆:8822 (大侠五级) | 2012-03-27 16:11
0

关注,学习!

lonely_rain | 园豆:752 (小虾三级) | 2012-03-29 17:21
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册