PoolThreadCache

缓存构成

  PoolThreadCache的缓存由三部分构成:tiny、small 和 normal。

tiny

  缓存数据大小区间为[16B, 496B]数据,数组长度为32,根据数据大小计算索引的办法:数据大小除以16,如下代码所示:

static int tinyIdx(int normCapacity) {
        return normCapacity >>> 4;
    }

small

  缓存数据大小区间为[512B, 4KB]数据,数组长度为4,根据数据大小计算索引的办法:数据大小除以512,然后log2得到指数,如下代码所示:

static int smallIdx(int normCapacity) {
        int tableIdx = 0;
        int i = normCapacity >>> 10;
        while (i != 0) {
            i >>>= 1;
            tableIdx ++;
        }
        return tableIdx;
    }

normal

  索引的计算思路同上。需要注意的是因为Normal的ByteBuf最大容量为16MB,且默认缓存64个,这是巨大的内存开销,所以Netty默认将容量上限设为32KB,即Normal默认可以缓存8KB、16KB和32KB的数据。

这里写图片描述

创建时机

  每个线程首次通过PoolThreadLocalCache获取所属的PoolThreadCache时进行创建,如下:

final class PoolThreadLocalCache extends FastThreadLocal<PoolThreadCache> {
        private final boolean useCacheForAllThreads;

        PoolThreadLocalCache(boolean useCacheForAllThreads) {
            this.useCacheForAllThreads = useCacheForAllThreads;
        }

        @Override
        protected synchronized PoolThreadCache initialValue() {
            final PoolArena<byte[]> heapArena = leastUsedArena(heapArenas);
            final PoolArena<ByteBuffer> directArena = leastUsedArena(directArenas);

            Thread current = Thread.currentThread();
            boolean fastThread = current instanceof FastThreadLocalThread;
            if (useCacheForAllThreads || current instanceof FastThreadLocalThread) {
                // If our FastThreadLocalThread will call FastThreadLocal.removeAll() we not need to use
                // the ThreadDeathWatcher to release memory from the PoolThreadCache once the Thread dies.
                boolean useTheadWatcher = fastThread ?
                        !((FastThreadLocalThread) current).willCleanupFastThreadLocals() : true;
                return new PoolThreadCache(
                        heapArena, directArena, tinyCacheSize, smallCacheSize, normalCacheSize,
                        DEFAULT_MAX_CACHED_BUFFER_CAPACITY, DEFAULT_CACHE_TRIM_INTERVAL, useTheadWatcher);
            }
            // No caching for non FastThreadLocalThreads.
            return new PoolThreadCache(heapArena, directArena, 0, 0, 0, 0, 0, false);
        }

        @Override
        protected void onRemoval(PoolThreadCache threadCache) {
            threadCache.free();
        }

        private <T> PoolArena<T> leastUsedArena(PoolArena<T>[] arenas) {
            if (arenas == null || arenas.length == 0) {
                return null;
            }

            PoolArena<T> minArena = arenas[0];
            for (int i = 1; i < arenas.length; i++) {
                PoolArena<T> arena = arenas[i];
                if (arena.numThreadCaches.get() < minArena.numThreadCaches.get()) {
                    minArena = arena;
                }
            }

            return minArena;
        }
    }

初始化逻辑

  1. 创建tiny、small 和 normal三类缓存数组;
  2. 注册清理任务,当线程不活跃时释放缓存的空间,防止线程意外结束时,没有释放内存空间,造成内存泄露;

参考:

  1. https://www.jianshu.com/p/9177b7dabd37
版权声明:本文为yangguosb原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yangguosb/article/details/81485030

智能推荐

WEB自动化测试中Xpath定位方法

前言: Xpath是在XML文档中查找信息的一种语言,使用路径表达式来选取XML文档中的节点或节点集,由于XML与HTML结构类似(前者用于传输数据,后者用于显示数据),所以Xpath也常用于查找HTML文档中的节点或节点集。 一  路径表达式: 路径以“/”开始     表示找到满足该绝对路径的元素; 路径以//”开始  ...

力扣困难难度 第4题 寻找两个正序数组的中位数

先看一眼题 我的思路: 设置下标i,j分别用于遍历两个数组,初始值均为0,直到找到两个数组中从小到大的第第length/2个数为止结束循环,length为两个数组长度之和。 ·每次比较nums[i]nums[j],如果前者小则i++,否则j++ ·循环结束时,如果count已经达到length/2,则说明已经找到了中位数,[注意:此时有可能正好其中一个数组遍历完了!所以...

[国家集训队]小Z的袜子(莫队)

[国家集训队]小Z的袜子 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿。终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这NN只袜子从1到NN编号,然后从编号LL到RR(LL 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同...

服务器配置(五) 服务器使用tomcat配置https全过程

一.了解服务器配置https协议 HTTPS,是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 配置HTTPS就需要证书,证书通过权威的CA机构付费获得的证书才能被互联网承认,我们将其放在服务器上面,配置好后,就可以进行https通信了。 通过https访问的网站,在地址前可以看到安全两个字,点击可以查...

SQL语言——基本概念、操作数据库、表、表记录、数据库备份与恢复、外键约束

SQL语言 1.基本概念 1.1 SQL SQL–Structured Query Language, 结构化查询语言,是关系型数据库通用的操作语言。 是一种非过程性语言。 由美国国家标准局(ANSI)与国际标准化组织(ISO)制定SQL标准。各大数据库厂商都对其做了实现。所以我们只要学会了SQL语言,就可以操作各大关系型数据库了。 为加强SQL的语言能力,各厂商增强了过程性语言的特征...

猜你喜欢

.net core3.1 dapper使用(Oracle链接字符串)

历经的艰辛就不多说了(.net 新手 不喜勿喷 欢迎指点) 废话不多说了,直接上正题: 1.首先建一个类来管理数据库连接 public class DbFactory : IDbFactory { readonly IOptions _options; public DbFactory(IOptions options) { _options = options; } public DbConne...

可自定义图片指示器并支持自定义Tab宽度的TabLayout

[置顶] 可自定义图片指示器并支持自定义Tab宽度的TabLayout 标签: 今日头条tablayout自定义tab宽度 2017-11-01 14:42 625人阅读 评论(3) 收藏 举报 分类: Android学习之路(21) 作者同类文章X 版权声明:转载请标明:http://blog.csdn.net/qq_27258799 目录(?)[+] 自定义图片指示器 自定义Tab宽度 方案1...

4.5、进程相关

进程:程序执行时,所需要的资源的集合总称 程序的一次执行过程 程序:一些指令的集合,存在在磁盘空间中,是静态的 进程:动态的执行过程(创建、调度、执行、消亡),指令的执行过程 程序包含: 1、用户数据段 2、正文段 进程包含的内容: 1、用户数据段:存放的是全局变量、常数以及动态数据分配的数据空间 2、正文段:存放的是程序中的代码 3、系统数据段 系统数据段包含: 1、进程控制块 2、cpu中pc...

数据结构-线性表

线性表 线性表的顺序表示和实现 线性表的顺序储存结构 线性表的数据结构定义 线性表的插入 线性表的删除 线性表的归并 优缺点 线性表的链式表示和实现 线性链表的逻辑状态 线性链表的数据结构定义 取链表中第i个元素 链表的插入 链表的删除 链表的逆序插入 链表归并 链表多项式合并 优缺点 简单链表类的实现...

tomcat启动失败之端口错误

1:项目介绍: 由于项目经测试通过已经运行在服务器上,过一段时间发现项目访问不了;查看日志得知tomcat挂掉了,没有了进程号,重启之后发现重启失败,无进程信息,查看日志发现8005端口被占用,修改端口,重启成功。 采坑点:重启之后日志查看不全, 把webapps里的war生成的文件删除,重新启动,快速打印出日志,抓取最主要的报错,避免寻找不是根本错误浪费时间。...