问题描述
做了个项目,发现页面错误每少几千个的增加.软件用了几个Bitmap,页面错误增量每少就4万多,代码运行一天,页面错误量达到2亿多.已经影响了软件的运行效率.新建一个简单新项目测试,发现这个问题:不知道什么原因?privatevoidForm1_Load(objectsender,EventArgse){timer1.Interval=1;timer1.Enabled=true;}privatevoidtimer1_Tick(objectsender,EventArgse){Bitmapbmp=newBitmap(320,240);Graphicsg=Graphics.FromImage(bmp);g.Dispose();g=null;bmp.Dispose();bmp=null;}
解决方案
解决方案二:
你可以不用每次创建Bitmap(只有大小改变的时候才需要重新创建)。Bitmapbmp=newBitmap(320,240);privatevoidtimer1_Tick(objectsender,EventArgse){Graphicsg=Graphics.FromImage(bmp);g.Dispose();}
解决方案三:
引用1楼Forty2的回复:
你可以不用每次创建Bitmap(只有大小改变的时候才需要重新创建)。Bitmapbmp=newBitmap(320,240);privatevoidtimer1_Tick(objectsender,EventArgse){Graphicsg=Graphics.FromImage(bmp);g.Dispose();}
谢谢,这是测试代码,软件中是你这样使用的.软件中有改善,但用C#写的程序,就算点击一个无代码的按钮,也会出页岩错误.不知道什么原因.想找到原因.
解决方案四:
PageFault(页面错误)本身是正常的,是内存管理的一种方式。只有大量的PageFault才是问题。
解决方案五:
引用3楼Forty2的回复:
PageFault(页面错误)本身是正常的,是内存管理的一种方式。只有大量的PageFault才是问题。
我这就是非常大的问题了.上天下来上亿个页面错误.是没手动处理C#的垃圾回收的原因?
解决方案六:
没有代码的button,也会提交到服务器,也会执行form_load,问题会不会在这里
解决方案七:
你倒是贴个错误来看看啊
解决方案八:
楼上的,人家是页面错误数量,跟错误没关系.我觉得完全可以无视这个问题.
解决方案九:
引用7楼wukaiping870123的回复:
楼上的,人家是页面错误数量,跟错误没关系.我觉得完全可以无视这个问题.
正是因为这是一个很“自然”的、应该无视的问题,所以才需要lz贴个错误出来。他贴不出来,但扑风捉影会把精神搞得错了乱了。。
解决方案十:
如果把interval设置到1000,也就是1s,你会看到pagefault的delta基本稳定在75。计算下就知道320*240*4/4096=75,也就是说这些pf是Bitmap,或者说是GDI+造成的。可以google看,会找到这样的说法:“GDI+bitmapsusememorymappedfiles.Thebitmapdatagetsloadedintomemorythroughpagefaults.”,如果是这样,那就谈不上影响效率,因为这种pf并不涉及磁盘I/O,更何况你无法控制GDI+的内部实现。为什么要创建如此多的Bitmap才是问题。