当前位置: 首页 > wzjs >正文

广州建设工程交易中心网站idzoom室内设计师网

广州建设工程交易中心网站,idzoom室内设计师网,无锡网站建设哪家好,wordpress分页条数昨天和一个朋友聊到图像处理软件内存占用多的问题,然后很自然聊到了GC,回想起以往很初学者都问到类似的问题: 1、C#自己就会垃圾回收,为什么我还要关心垃圾回收? 2、GC可以回收垃圾,但回收的时候又会让线…

昨天和一个朋友聊到图像处理软件内存占用多的问题,然后很自然聊到了GC,回想起以往很初学者都问到类似的问题:

1、C#自己就会垃圾回收,为什么我还要关心垃圾回收?

2、GC可以回收垃圾,但回收的时候又会让线程卡住,我到底该不该GC.Collect()?

为了回答这些问题,我们先从一个小实验讲起

我们先做这样一个程序,不断从电脑摄像头读取图像,然后显示出来,代码很简单:

using OpenCvSharp;using var capture = new VideoCapture(0, VideoCaptureAPIs.DSHOW);
if (!capture.IsOpened())return;capture.FrameWidth = 1920;
capture.FrameHeight = 1280;
capture.AutoFocus = true;const int sleepTime = 10;using var window = new Window("capture");while (true)
{var image = new Mat();capture.Read(image);if (image.Empty())break;window.ShowImage(image);int c = Cv2.WaitKey(sleepTime);if (c >= 0){break;}
}

你将看到,内存持续增长,直到发生GC,如此往复:

 现在我们加入手动GC:


using OpenCvSharp;using var capture = new VideoCapture(0, VideoCaptureAPIs.DSHOW);
if (!capture.IsOpened())return;capture.FrameWidth = 1920;
capture.FrameHeight = 1280;
capture.AutoFocus = true;const int sleepTime = 10;using var window = new Window("capture");while (true)
{var image = new Mat();capture.Read(image);if (image.Empty())break;window.ShowImage(image);int c = Cv2.WaitKey(sleepTime);//手动触发GCGC.Collect();if (c >= 0){break;}
}

可以看到,随着密集的GC,内存占用平稳了:

但是,问题解决了吗?有经验的小伙伴会知道,GC会让程序变卡,所以手动GC在大多数时间并不是一个万能灵药,相反是毒药,那么真正的解决方案是什么呢?

我们把代码再改一下:

把GC.Collect(); 改成 image.Dispose();


using OpenCvSharp;using var capture = new VideoCapture(0, VideoCaptureAPIs.DSHOW);
if (!capture.IsOpened())return;capture.FrameWidth = 1920;
capture.FrameHeight = 1280;
capture.AutoFocus = true;const int sleepTime = 10;using var window = new Window("capture");while (true)
{var image = new Mat();capture.Read(image);if (image.Empty())break;window.ShowImage(image);int c = Cv2.WaitKey(sleepTime);// GC.Collect();    //手动触发GCimage.Dispose();   //手动释放对象if (c >= 0){break;}
}

可以看到,即没有发生内存暴涨,也没有发生GC。

为什么呢?GC.Collect(); 和 image.Dispose(); 分别发生了什么?

GC.Collect(); 时,程序内部发生了大迁徙:

第一步 GC线程会把其它线程从合作模式转换到抢占模式,合作模式线程可以访问托管堆和非托管堆,抢占模式只能访问非托管堆,可以简单的认为,GC线程会暂停其它线程。

第二步 把托管堆的对象都标记为垃圾(我不是针对谁)。

第三步 标记出存活的对象。

第四步 清理失活对象,把标记存活的对像向前移动,覆盖空闲内存区,在后部空出整片的空闲区。

第五步 恢复其它线程。

image.Dispose();时,程序只是把imgae对象所占的区域标定为空闲区。成本是极低的。

GC的成本很高,我应该想办法避免GC,尤其是在程序需要高实时响应的场合,那么又有了新的问题:

能避免自动GC吗?

首先,不需要过分担心自动GC,因为它和手动GC的“成本”大多数情况下并不相同。

为了不动辄进行大迁徙,设计者有设计分代回收的优化策略,一般对象初始化时会放在0代,每经历一次GC还能存活,就会上升一代,最终来到2代。大对象(大于85,000 byte) 比如图像初始化时就在2代。0代和1代的空间比较小,这样也是为了加速GC,自动GC一般不会像手动GC那样,把所有的代都整一遍,而是会优先回收低代内存,如果不够才会回收高代。

但避免自动GC还是我们的终极目标,想避免自动GC,首先要明白,自动GC什么时候会发生?

1、给新对象分配空间时,发现不够了。

2、收到系统物理内存不够的通知。

所以,总结一下:

1、大对象要手动销毁。别人实现的.Dispose()的要记得调用,自己写的大对象类要实现.Dispose()。

2、力大砖飞,物理内存要够大。

3、在合适的时候手动GC。

4、避免频繁创建大对象,比如上面的代码最优应该是下面这样:


using OpenCvSharp;using var capture = new VideoCapture(0, VideoCaptureAPIs.DSHOW);
if (!capture.IsOpened())return;capture.FrameWidth = 1920;
capture.FrameHeight = 1280;
capture.AutoFocus = true;const int sleepTime = 10;using var window = new Window("capture");//在循环外创建大对象
using var image = new Mat();while (true)
{capture.Read(image);if (image.Empty())break;window.ShowImage(image);int c = Cv2.WaitKey(sleepTime);if (c >= 0){break;}
}


文章转载自:

http://8a0Iuk8E.hwnnh.cn
http://WfU4uceY.hwnnh.cn
http://KzGUuyFU.hwnnh.cn
http://B6VLzv0g.hwnnh.cn
http://jszd5C6h.hwnnh.cn
http://TJ2X4iaY.hwnnh.cn
http://jlua54Z8.hwnnh.cn
http://LIt6MWnA.hwnnh.cn
http://wAzqbzLZ.hwnnh.cn
http://VnHZTQsN.hwnnh.cn
http://xWC0kiSV.hwnnh.cn
http://25ABfkEf.hwnnh.cn
http://kATbjr8x.hwnnh.cn
http://haneDS1N.hwnnh.cn
http://Tgq8MvHL.hwnnh.cn
http://XPKSDemS.hwnnh.cn
http://ILqhuQQv.hwnnh.cn
http://FtkkaVNy.hwnnh.cn
http://P7m6X4FH.hwnnh.cn
http://956XZWTx.hwnnh.cn
http://YlkoeJzL.hwnnh.cn
http://rxHqIpg3.hwnnh.cn
http://PxMULChz.hwnnh.cn
http://AfomCdEs.hwnnh.cn
http://wuviag6p.hwnnh.cn
http://WnevEDyv.hwnnh.cn
http://1zKBg35d.hwnnh.cn
http://kpThzJ0s.hwnnh.cn
http://nyfGZGzd.hwnnh.cn
http://qu3WhG5r.hwnnh.cn
http://www.dtcms.com/wzjs/673429.html

相关文章:

  • 南京酒店网站制作网站头部 标签
  • 上海网站网络科技有限公司昆山app网站制作
  • 兰州市城乡和住房建设局网站店面设计师岗位职责
  • 广州网站平台建设做网站合同范本
  • 白银市网站建设asp.net 价格查询网站
  • 烟台网站建设wordpress设置静态页
  • 石家庄桥西招聘 网站优化平阳县城乡规划建设局网站
  • 简单的公司资料网站怎么做望牛墩镇网站建设公司
  • 企业网站添加图片中信建设有限责任公司华美分公司
  • 花卉网站建设的总结与网站如何做整合营销
  • 黄冈网站推广软件视频下载网站优化有什么用
  • 盘州市网站建设中国最大的电商平台是哪家
  • 做外贸英文网站哪家好海外建站服务平台
  • app应用网站html5模板什么是网络营销中的广告联盟
  • 高端大气网站源码h5网页制作代码
  • 婚嫁网站设计在线制作表白网页浪漫
  • 移动门网站建设商标在线设计logo图案
  • 本地网站建设电话WordPress做推广
  • 做网批有专门的网站吗沧州市
  • 动力无限网站效果好不好哈尔滨快速制作网站
  • 怎样做免费的网站莆田网站设计
  • 营销网站建设计划书安阳县高级中学
  • 莆田中小企业网站制作做整形网站多少钱
  • 资讯网站 怎样 增强用户粘度大学网站建设评比考核办法
  • 红河做网站的公司织梦视频资讯网站源码
  • 网站的建设费用预算淘乐惠网站怎么做
  • 如何分析网站开发语言广告发布网站开发
  • 数码港 太原网站开发公司wordpress 发布文章 慢
  • 狼雨seo网站企业形象网站解决方案
  • 哪个做网站公司好自己设计手机的网站