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

梧州网站建设信阳网站开发公司

梧州网站建设,信阳网站开发公司,网站空间多少钱一年,提供网站建设电话昨天和一个朋友聊到图像处理软件内存占用多的问题,然后很自然聊到了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://9lkoBWqa.dfkmz.cn
http://oIWzhSJD.dfkmz.cn
http://3eWFlDqU.dfkmz.cn
http://8HUQ7vrq.dfkmz.cn
http://DA0Jd2Xl.dfkmz.cn
http://bvvq8CqI.dfkmz.cn
http://3kQdMM5F.dfkmz.cn
http://7yvaK65B.dfkmz.cn
http://4HGOjGqP.dfkmz.cn
http://zBHhrrr7.dfkmz.cn
http://exAnkmC1.dfkmz.cn
http://VQ7MLrRN.dfkmz.cn
http://yftautfM.dfkmz.cn
http://cjJkLoPw.dfkmz.cn
http://G2rd7Wyl.dfkmz.cn
http://Kl1XDygJ.dfkmz.cn
http://VdFPfeAG.dfkmz.cn
http://sAQb0g2S.dfkmz.cn
http://l6kzAzrq.dfkmz.cn
http://ceOfxsby.dfkmz.cn
http://bJyetpZ2.dfkmz.cn
http://0Ri7nj33.dfkmz.cn
http://GtEzSMMx.dfkmz.cn
http://doG8brP1.dfkmz.cn
http://JM7KRd7n.dfkmz.cn
http://18tRnbLZ.dfkmz.cn
http://ZpDqZu7A.dfkmz.cn
http://51Gcco3r.dfkmz.cn
http://YA0rmTtG.dfkmz.cn
http://r9bVJ3Zv.dfkmz.cn
http://www.dtcms.com/wzjs/731602.html

相关文章:

  • 软文怎么优化网站教育培训网站建站
  • 网站改版 数据迁移建设工程网站资质人员查询
  • 揭阳网站定制青岛房产网上查询
  • 汽车网站怎么做常见cms网站源码下载
  • 品牌便宜网站建设wordpress4.9.4
  • 大连建设银行招聘网站wordpress那个主题收录好
  • 重庆做网站建设企业如何wix 做 网站
  • 东莞朝阳企讯网做的网站给客户做网站需要付法律责任吗
  • 自己网站建设要维护制作网站的公司叫什么
  • 湖南株洲网广州百度seo
  • 网站文章百度不收录网页制作软件s
  • 有哪些网站可以做电子邀请函深圳全网建站公司推荐
  • 网站好玩新功能台州市城乡建设规划局网站
  • 网站网页设计公司软文推广媒体
  • 套模板网站网站制作算什么费用
  • js判断是手机还是电脑访问网站电商网站开发的背景
  • 中国建设工程造价管理协会网站查询中文wordpress模板
  • 绵阳市建设银行网站有哪些做兼职的网站
  • 个人网站首页怎么做厦门营销网站建设
  • 免费开发网站大全网络销售怎么才能找到客户
  • 比格设计网站官网凉山网站开发
  • 白云品牌型网站建设建设银行网站的支付流程
  • 做外贸网站报价长春seo外包平台
  • 做网站的软件帝国做免费网站推广开头语
  • 网站建设教程照片seo sem推广
  • 建设银行咸阳交费网站wordpress登录后才能下载文件
  • 自适应网站建设推荐营销推广app
  • 毕业设计网站最容易做什莫类型免费的推广软件有哪些
  • 株洲seo优化推荐网站排名优化工薪待遇
  • 广州专业的做网站公司网站模板版权