刚刚骚情的跑了下NLog测试,,,,,一篇文章就那么Crash了~~~
好吧,这次简化下,直接进入正题,有关GC的东东参考网上大部分文章吧。

源码分析

// StringBuilder 的建立也会耗费大量的资源,因此共用他们,使用这个类来管理池子
//需要了从这里获取一个,用完自动释放 ItemHolder 即可释放会池子
// 例如  using (var itemHolder = pool.Acquire()){}
internal class StringBuilderPool{private StringBuilder _fastPool;private readonly StringBuilder[] _slowPool;private readonly int _maxBuilderCapacity;/// <summary>/// Constructor/// </summary>/// <param name="poolCapacity">Max number of items</param>/// <param name="initialBuilderCapacity">Initial StringBuilder Size</param>/// <param name="maxBuilderCapacity">Max StringBuilder Size</param>public StringBuilderPool(int poolCapacity, int initialBuilderCapacity = 1024, int maxBuilderCapacity = 512 * 1024){//一个快速池子,一直保持_fastPool = new StringBuilder(10 * initialBuilderCapacity);// 一个慢速池子,如果快速池子被占用,则从慢速池子取一个_slowPool = new StringBuilder[poolCapacity];for (int i = 0; i < _slowPool.Length; ++i){_slowPool[i] = new StringBuilder(initialBuilderCapacity);}_maxBuilderCapacity = maxBuilderCapacity;}/// <summary>/// Takes StringBuilder from pool/// </summary>/// <returns>Allow return to pool</returns>public ItemHolder Acquire(){//1.come on baby,先尝试分配快速池子StringBuilder item = _fastPool;//2.如果你幸运的拿到快速池子,则尽快把快速池子置空,不要让别人抢到了,否则,你就必须进慢速池子取了if (item == null || item != Interlocked.CompareExchange(ref _fastPool, null, item)){//3.你好,兄弟,你已经进入慢车道,来,一个个给你试试能用不for (int i = 0; i < _slowPool.Length; i++){item = _slowPool[i];if (item != null && item == Interlocked.CompareExchange(ref _slowPool[i], null, item)){//4.啊哈,发现一个慢速的,来,给你,别嫌弃return new ItemHolder(item, this, i);}}//这么倒霉,一个都没有,算了,再给你分配一个新的吧,记住,你的编号~~~咦, 第0个吧~~~return new ItemHolder(new StringBuilder(), null, 0);}else{//你是幸运之星,快速跑~~~~return new ItemHolder(item, this, -1);}}/// <summary>/// Releases StringBuilder back to pool at its right place/// </summary>private void Release(StringBuilder stringBuilder, int poolIndex){//来,兄弟,好借好还,再借不难//什么,这么大,我记得借你时没这么大啊,让我再检查检查if (stringBuilder.Length > _maxBuilderCapacity){//我靠,你是快车道的,那就给你10倍大小如何,这都超了,那对不起,减半了~~// Avoid high memory usage by not keeping huge StringBuilders alive (Except one StringBuilder)int maxBuilderCapacity = poolIndex == -1 ? _maxBuilderCapacity * 10 : _maxBuilderCapacity;if (stringBuilder.Length > maxBuilderCapacity){stringBuilder = new StringBuilder(maxBuilderCapacity / 2);}}stringBuilder.Length = 0;//好,各就各位...if (poolIndex == -1){_fastPool = stringBuilder;}else{_slowPool[poolIndex] = stringBuilder;}}//下面是个池化对象类/// <summary>/// Keeps track of acquired pool item/// </summary>public struct ItemHolder : IDisposable{public readonly StringBuilder Item;readonly StringBuilderPool _owner;readonly int _poolIndex;public ItemHolder(StringBuilder stringBuilder, StringBuilderPool owner, int poolIndex){Item = stringBuilder;_owner = owner;_poolIndex = poolIndex;}/// <summary>/// Releases pool item back into pool/// </summary>public void Dispose(){if (_owner != null){_owner.Release(Item, _poolIndex);}}}}

NLog源码解读——StringBuilderPool相关推荐

  1. Bert系列(二)——源码解读之模型主体

    本篇文章主要是解读模型主体代码modeling.py.在阅读这篇文章之前希望读者们对bert的相关理论有一定的了解,尤其是transformer的结构原理,网上的资料很多,本文内容对原理部分就不做过多 ...

  2. Bert系列(三)——源码解读之Pre-train

    https://www.jianshu.com/p/22e462f01d8c pre-train是迁移学习的基础,虽然Google已经发布了各种预训练好的模型,而且因为资源消耗巨大,自己再预训练也不现 ...

  3. linux下free源码,linux命令free源码解读:Procps free.c

    linux命令free源码解读 linux命令free源码解读:Procps free.c 作者:isayme 发布时间:September 26, 2011 分类:Linux 我们讨论的是linux ...

  4. nodeJS之eventproxy源码解读

    1.源码缩影 !(function (name, definition) { var hasDefine = typeof define === 'function', //检查上下文环境是否为AMD ...

  5. PyTorch 源码解读之即时编译篇

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 作者丨OpenMMLab 来源丨https://zhuanlan.zhihu.com/ ...

  6. Alamofire源码解读系列(九)之响应封装(Response)

    本篇主要带来Alamofire中Response的解读 前言 在每篇文章的前言部分,我都会把我认为的本篇最重要的内容提前讲一下.我更想同大家分享这些顶级框架在设计和编码层次究竟有哪些过人的地方?当然, ...

  7. Feflow 源码解读

    Feflow 源码解读 Feflow(Front-end flow)是腾讯IVWEB团队的前端工程化解决方案,致力于改善多类型项目的开发流程中的规范和非业务相关的问题,可以让开发者将绝大部分精力集中在 ...

  8. spring-session源码解读 sesion

    2019独角兽企业重金招聘Python工程师标准>>> spring-session源码解读 sesion 博客分类: java spring 摘要: session通用策略 Ses ...

  9. 前端日报-20160527-underscore 源码解读

    underscore 源码解读 API文档浏览器 JavaScript 中加号操作符细节 抛弃 jQuery,拥抱原生 JS 从 0 开始学习 GitHub 系列之「加入 GitHub」 js实现克隆 ...

最新文章

  1. 《巨富们给年轻人的45个忠告》读后感
  2. vlc windows 编译文档
  3. Elasticsearch 入门教程
  4. JavaScript中的原型prototype及原型链
  5. 基于 Kubernetes 的微服务部署即代码
  6. zdal配置文件_Autofac的基本使用---4、使用Config配置
  7. 在Data Lake Analytics中使用视图 1
  8. 使用OData协议查询Windows日志
  9. Potted Flower(线段树+dp)
  10. 工作了五年才明白的道理,这些原来我一开始就做错了
  11. java调取对方接口_java中如何调用对方接口
  12. luaprofiler探索
  13. 动态加载执行 JS 文件、对话框 confirm 方法
  14. socket编程常用函数
  15. 开课吧java广告,开课吧Java面试题:虚引用与软引用和弱引用的区别
  16. 戴建业老师对李白和杜甫的讨论
  17. Go学习——runtime.Caller()函数
  18. FEDORA9安装后的配置lvlv全记录必看一览表 解决FC9安装后网络需激活
  19. 9月11日 XE8移动开发入门(五)XE8中使用DataSnap三层架构和Beacon组件简介
  20. Cesium发光边界

热门文章

  1. MSFT Outlook VBA处理新邮件的方法
  2. fedora12下pppoe服务器的搭建
  3. python 切片_全面解读Python高级特性切片
  4. that is why用法
  5. springboot小笔记
  6. 我对于全栈工程师的理解
  7. highcharts动态获取数据生成图表问题
  8. IE6下margin-left双倍bug问题
  9. Apache并发处理模块
  10. 如何将Rant变成生产力电动工具