关于wince系统的内存碎片,收集贴



------
做这个项目以来,多次在wince系统下遇到过内存碎片,这个东西非常可怕
先说我的:
  wince下gdi资源频繁创建回收会出现内存碎片
  内存动态分配回收频繁会产生内存碎片
  频繁的刷屏,过多的使用invalidate等函数也能产生内存碎片
  最好能将WM_ERASEBKGND的响应函数OnEraseBkgnd阻截修改成return true;
  克服内存最有效的方法是程序只有一次内存申请,并且只有一次释放(当然这需要程序框架上做保障)
应用领域:
  我是做运动控制软件的,实时性和稳定性要求较高,长期运行,程序需要频繁刷屏
大家来说一说自己的认识吧,呵呵痛苦的滋味,你是否有体会
------
我现在只能做到,界面无用户操作的情况下,后台运行程序内存保持不变
------
我们公司也是在wince上开发,做金融方面的软件,画图的操作很多,用MFC做的切换视图也很多,反正机器是挺慢的,内存泄漏还不少!来学习下有什么好的解决方案
------
呵呵讨论的请注意哦
内存碎片和内存泄露不是一回事哦,当然某种程度上也一样
都是内存不能再使用了,需要掉电才可以
但是我们最好将这两个概念分开,因为克服这两者的方法是不同的
------
哈哈每人关注,失落啊
------
UP
------
UP
------
学习啊
------
用内存池管理阿
------
1.少用new,delete,尽量在栈上分配空间,会不会好一些。

2.用多少,分配多少,不分配多余的缓冲区。
------
频繁创建释放GDI对象和内存的设计,本身就有问题
碎片的问题应该在模块设计的地方避免,而不是在技术细节上处理
我分析过STL的内存池,也写过基于内存池的小内存分配器,效果并不明显,效率也比较低
最终还是在系统数据结构上重新处理才达到满意效果
------
up navi_dx
------
很好!学习收藏了!
------
Thank you!
------
up
------
UP
------
很好!
------
内存的东西确实不好弄,关注一下了!不知道CE下有没好的内存监视工具!
------
关注~~
------
关注 学习
------
jf
------
很奇怪的是资源自己分配自己释放的时候
退出时系统会提示assert failed错误

此外
在连续刷新界面后,界面会出现绘图失败的情况,特别是快速操作的时候
个人怀疑是内存方面的问题
但是由于是在模拟器上运行
看不到内存变化情况
------
我的情况和楼主的差不多,也是做PDA手持设备的,用户经常要在上面点,界面要经常刷新!
我的处理方式跟楼主讲的差不多,在OnEraseBkgnd里面,用内存DC一次性画上去,我也用了很多的Invalidate()函数,但没考虑到那么深,呵呵,我感觉我是在函数内部定义的CDC对象指针,应该执行完后系统会自动释放回收!


不过我最近在弄这样一个问题: 《要实现一幅位图在屏幕上移动的时候,能够显示它移动的轨迹,》

 要达到这个效果,是不是只能用屏幕DC来画,用内存DC能不能够实现?
 我之前是用内存DC来画,然后一次性BitBlt到屏幕DC上,但是这样的效果是,移动位图是静态的,位图从一个地方突然出 现在另一个地方,没有动态移动的效果。


  我最初的想法是:想在函数里面多次调用Invalidate(),动一次我就刷一次,但看了这篇文章之后,让我有点不敢这样做了,怕会很浪费资源,请问各位高手有没有好的高招??
------
不错,看看
------
高手
------
高手
------
GDI资源的申请和释放的确是个很麻烦的问题!关注一下!
------
UP
------
Mark
------
如果是在Windows PC上, 直接申请一块很大的虚拟内存,然后自己管理内存的申请释放。


------
太深了,都看不懂
------
关注下
------
up!!!
------
关注
------
很好很好
------
GDI对象在后台运行,不多次销毁..
------
是个难题啊
------
Lookaside List(旁视列表)可以大大提高缓存的使用能力
------
mark
------
边风炜投资俱乐部http://bianfengwei.blogspot.com/ http://bfwbk.blog.sohu.com/
股民最受欢迎分析师,第一财经常年特约嘉宾,边风炜的投资俱乐部http://blog.sina.com.cn/shjidu 
联系电话:13564171843 第一财经边风炜 边风炜的博客 边风炜语录
------
http://www.designkey.cn 
标志设计
LOGO设计
画册设计
海报设计
设计公司

<a href=http://www.designkey.cn/cysj.asp>画册设计</a>
<a href=http://www.designkey.cn/cysj.asp>标志设计</a>
<a href=http://www.designkey.cn/cysj.asp>LOGO设计</a>
<a href=http://www.designkey.cn/cysj.asp>画册设计</a>
<a href=http://www.designkey.cn/cysj.asp>海报设计</a>
<a href=http://www.designkey.cn/cysj.asp>设计公司</a>

------
关注
------
考虑合适的内存池
------
学习中
------
刚开始用内存DC,将图片画好之后再一次显示出来。由于没有释放内存Bitmap,这样内存很快就占完了。后来注意到这点,对话框销毁的时候释放内存Bitmap。但是刷新多了还是会有内存使用增加的现象,好像是每次增加4K空间。这可能就是内存碎片了吧。

也没有找到好的解决办法。关注中。。。。
------
与楼上同感,但未找到解决方法~~~
------
很好!学习收藏了!
------
自己实现内存分配回收模块
------
up
------
引用 20 楼 xqhrs232 的回复:
内存的东西确实不好弄,关注一下了!不知道CE下有没好的内存监视工具!

------
引用 25 楼 kuangyong06 的回复:
在OnEraseBkgnd里面,用内存DC一次性画上去,我也用了很多的Invalidate()函数

------
个人认为用OnPait代替OnEraseBkgnd的理由是
工控软件或者嵌入式系统软件不是全屏的很少,感觉在wince下后者实在是有些画蛇添足
每次还要单独处理它,真是很烦,麻烦还没有什么用
------
刷屏也可以选择InvalidateRect(rect,false),这样只重画部分区域,但是这样整个OnPain()函数还是执行了一遍,GDI产生的内存碎片还是避免不了的
------
学习了
------
会在WINCE上做应用的通常都是工业级应用,其实WINCE的设计目标就是工业级应用场合
要做到工业级的性能、稳定性、可靠性的话,把握几个基本原则
为应用建立起固态的、稳定的应用环境;所有的输入输出都是不可信任的。。。。

楼主给分吧
------
好深奥,眩晕中。。。
------
初来乍到,学习下
------
mark~~
------
mark下,支持
------
引用 60 楼 flowlight 的回复:
会在WINCE上做应用的通常都是工业级应用,其实WINCE的设计目标就是工业级应用场合
要做到工业级的性能、稳定性、可靠性的话,把握几个基本原则
为应用建立起固态的、稳定的应用环境;所有的输入输出都是不可信任的。。。。

楼主给分吧

------
引用 59 楼 flowlight 的回复:
1、内存碎片问题在现在的各种操作系统都存在,并不是WINCE上独有的,具体可以去看操作系统原理中的内存管理策略章节
2、因为应用的不同,应用程序对内存使用上有两种不同角度:要使用时才申请,用完后就立即释放;可以先申请,要使用时就直接用,用完也不释放,完全不用时才释放
前者通常用于商业性质的软件开发,多应用共同使用计算机全局内存,优点很明显,因需要时在占有资源,内存等资源环境为动态的,内存使用效率是最优化…

------
up
------
加分
------
引用 67 楼 dch4890164 的回复:
引用 59 楼 flowlight 的回复:
1、内存碎片问题在现在的各种操作系统都存在,并不是WINCE上独有的,具体可以去看操作系统原理中的内存管理策略章节
2、因为应用的不同,应用程序对内存使用上有两种不同角度:要使用时才申请,用完后就立即释放;可以先申请,要使用时就直接用,用完也不释放,完全不用时才释放
前者通常用于商业性质的软件开发,多应用共同使用计算机全局内存,优点很明显,因需要时在占有资源,内存等资源环…

------
换个想法问题解决不少,
------
mark
桂ICP备07017180号