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

asp网站制作教程社交电商

asp网站制作教程,社交电商,网站建设的市场策划,网站建设 需要ae吗一#xff1a;背景 1. 讲故事最近在分析一个 dump 的过程中发现其在 gen2 和 LOH 上有不少size较大的free#xff0c;仔细看了下#xff0c;这些free生前大多都是模板引擎生成的html片段的byte[]数组#xff0c;当然这篇我不是来分析dump的#xff0c;而是来聊一下#x… 一背景 1. 讲故事最近在分析一个 dump 的过程中发现其在 gen2 和 LOH 上有不少size较大的free仔细看了下这些free生前大多都是模板引擎生成的html片段的byte[]数组当然这篇我不是来分析dump的而是来聊一下当托管堆有很多length较大的 byte[] 数组时如何让内存利用更高效如何让gc老先生压力更小。不知道大家有没有发现在 .netcore 中增加了不少池化对象的东西比如ArrayPoolObjectPool 等等确实在某些场景下还是特别实用的所以有必要对其进行较深入的理解。二ArrayPool 源码分析 1. 一图胜千言在我花了将近一个小时的源码阅读之后我画了一张 ArrayPool 的池化图所谓一图在手,天下我有 。有了这张图接下来再聊几个概念并配上相应源码我觉得应该就差不多了。2. 池化的架构分级是什么样的ArrayPool 是由若干个 Bucket 组成 而 Bucket 又由若干个 buffer[] 数组组成, 有了这个概念之后再配一下代码。 public abstract class ArrayPoolT {public static ArrayPoolT Create(){return new ConfigurableArrayPoolT();} }internal sealed class ConfigurableArrayPoolT : ArrayPoolT {private sealed class Bucket{internal readonly int _bufferLength;private readonly T[][] _buffers;private int _index;}private readonly Bucket[] _buckets;     //bucket数组 }3. 为什么每一个 bucket 里都有 50 个 buffer[]这个问题很好回答初始化时做了 maxArraysPerBucket50 设定当然你也可以自定义具体参考如下代码 internal sealed class ConfigurableArrayPoolT : ArrayPoolT {internal ConfigurableArrayPool() : this(1048576, 50){}internal ConfigurableArrayPool(int maxArrayLength, int maxArraysPerBucket){int num  Utilities.SelectBucketIndex(maxArrayLength);Bucket[] array  new Bucket[num  1];for (int i  0; i  array.Length; i){array[i]  new Bucket(Utilities.GetMaxSizeForBucket(i), maxArraysPerBucket, id);}_buckets  array;} }4.  bucket 中 buffer[].length 为什么依次是 163264 ...框架做了默认假定第一个bucket中的 buffer[].length16, 后续 bucket 中的 buffer[].length 都是 x2 累计涉及到代码就是 GetMaxSizeForBucket() 方法参考如下 internal ConfigurableArrayPool(int maxArrayLength, int maxArraysPerBucket) {Bucket[] array  new Bucket[num  1];for (int i  0; i  array.Length; i){array[i]  new Bucket(Utilities.GetMaxSizeForBucket(i), maxArraysPerBucket, id);} }internal static int GetMaxSizeForBucket(int binIndex) {return 16  binIndex; }5. 初始化时 bucket 到底有多少个其实在上图中我也没有给出 bucket 到底有多少个那到底是多少个呢???????????? 当我阅读完源码之后这算法还挺有意思的。先说一下结果吧默认 17 个 bucket你肯定会好奇怎么算的先说下两个变量maxArrayLength1048576 2的20次方buffer.length 16 2的4次方最后的算法就是取次方的差值bucket[].length 20 - 4 1 17换句话说最后一个 bucket 下的 buffer[].length1048576详细代码请参考 SelectBucketIndex() 方法。 internal sealed class ConfigurableArrayPoolT : ArrayPoolT {internal ConfigurableArrayPool(): this(1048576, 50){ }internal ConfigurableArrayPool(int maxArrayLength, int maxArraysPerBucket){int num  Utilities.SelectBucketIndex(maxArrayLength);Bucket[] array  new Bucket[num  1];for (int i  0; i  array.Length; i){array[i]  new Bucket(Utilities.GetMaxSizeForBucket(i), maxArraysPerBucket, id);}_buckets  array;}internal static int SelectBucketIndex(int bufferSize){return BitOperations.Log2((uint)(bufferSize - 1) | 0xFu) - 3;} }到这里我相信你对 ArrayPool 的池化架构思路已经搞明白了接下来看下如何申请和归还 buffer[]。三如何申请和归还 既然 buffer[] 做了颗粒化那就应该好借好还反应到代码上就是 Rent() 和 Return() 方法为了方便理解上代码说话class Program{static void Main(string[] args){var arrayPool  ArrayPoolint.Create();var bytes  arrayPool.Rent(10);for (int i  0; i  bytes.Length; i) bytes[i]  10;arrayPool.Return(bytes);Console.ReadLine();}}有了代码和图之后再稍微捋一下流程。从 ArrayPool 中借一个 byte[10] 大小的数组为了节省内存先不备货临时生成一个 byte[].size16 的数组出来简化后的代码如下参考 if (flag) 处internal T[] Rent(){T[][] buffers  _buffers;T[] array  null;bool lockTaken  false;bool flag  false;try{if (_index  buffers.Length){array  buffers[_index];buffers[_index]  null;flag  array  null;}}if (flag){array  new T[_bufferLength];}return array;}这里有一个坑那就是你以为借了 byte[10]现实给你的是 byte[16]这里稍微注意一下。当用 ArrayPool.Return 归还 byte[16] 时, 很明显看到它落到了第一个bucket的第一个buffer[]上参考如下简化后的代码internal void Return(T[] array){if (_index ! 0){_buffers[--_index]  array;}}这里也有一个值得注意的坑那就是还回去的 byte[16] 里面的数据默认是不会清掉的从上面的代码也是可以看出来的要想做清理需要在 Return 方法中指定 clearArraytrue参考如下代码public override void Return(T[] array, bool clearArray  false){int num  Utilities.SelectBucketIndex(array.Length);if (num  _buckets.Length){if (clearArray){Array.Clear(array, 0, array.Length);}_buckets[num].Return(array);}}四总结 学习这其中的 池化架构 思想对平时项目开发还是能提供一些灵感的其次对那些一次性使用 byte[] 的场景用池化是个非常不错的方法这也是我对朋友dump分析后提出的一个优化思路。END工作中的你是否已遇到 ... 1. CPU爆高2. 内存暴涨3. 资源泄漏4. 崩溃死锁5. 程序呆滞等紧急事件全公司都指望着你能解决...  危难时刻才能展现你的技术价值作为专注于.NET高级调试的技术博主欢迎微信搜索: 一线码农聊技术免费协助你分析Dump文件希望我能将你的踩坑经验分享给更多的人。
http://www.zqtcl.cn/news/597396/

相关文章:

  • 河南民基建设工程有限公司网站齐齐哈尔建设局网站首页
  • 响应式网站建设推荐乐云践新三丰云免费云服务器
  • 长沙网站建设模板uc浏览器访问网站
  • 擼擼擼做最好的导航网站陕西政务服务网注册公司流程
  • 怎样做商城网站的推广wordpress用php哪个版本好
  • 网站功能模块建设建设网站考证
  • 网站代码结构成都住建局官网报名入口
  • 吴桥县网站建设房产门户网站模板
  • 标签化网站网络服务类型及其所采用的网络协议
  • 做网站服务器应该怎么配置网页美工设计实践性教案
  • 响应式网站导航栏内容泰安网站营销推广
  • 南通营销网站开发软件开发工具名词解释
  • 吉林企业网站模板建站哪个好wordpress后台新建慢
  • 整合营销的成功案例肇庆seo优化
  • 网站关键字标签合肥高端网站建设设计公司哪家好
  • 大型企业网站设计案例免费在线看片
  • 云南网站开发公司找哪家网站弹出式链接后台怎么做
  • 电商网站的支付模块怎么做企业网站建设招标文件
  • 旅游在线网站开发十八个免费的舆情网站
  • 网站怎么申请百度小程序火车头采集发布wordpress
  • 外贸网站的推广技巧有哪些莱芜网吧
  • 溧阳城乡建设局网站ps中网站页面做多大的
  • sns社交网站 有哪些wordpress开发分类筛选
  • 黄石网站建设教程网上怎样查询企业资质
  • 国内设计师交流网站怎样做自己的网站钻钱
  • 无锡专业网站推广网络营销组合策略
  • 网站建设的安全威胁中国建设银行的网站色彩
  • 中小型企业网站建设与管理潍坊做网站哪家公司最好
  • 广州白云机场网站建设免费的网站模版
  • 商务网站建设策划书51网站怎么打开