![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
netty
文章平均质量分 62
jaaawaaa
这个作者很懒,什么都没留下…
展开
-
Netty内存泄漏原理
Netty内存泄漏原理原创 2023-11-01 09:21:39 · 170 阅读 · 1 评论 -
Netty内存管理系统原理八
Netty内存管理系统原理八原创 2023-11-01 09:20:44 · 41 阅读 · 1 评论 -
Netty内存管理系统原理七
如果是别的线程,是不能push到别的线程的Stack的,会放到线程本地的一个WeakHashMap里面,key是Stack,value是一个Link链表,把对象放到Link链表中,当Recycler去拿对象的时候,本地线程的Stack中没有了,就会找到head指向的链表,从Link中取出那些待回收的对象,把他们转移到本地的Stack中,这个WHM是一个单消费者,单生产者模型,不会有并发安全问题,即使在极端的情况下,也不会出现,顶多拿不到就new一个新的对象返回。原创 2023-10-31 17:02:17 · 23 阅读 · 1 评论 -
Netty内存管理系统原理六
理论上来说,如果想减少内存碎片,分配的时候应该优先从75%的Chunk去分配,但是如果从最小的里面去分配,那就很有可能分配失败,还要重试多次,上多次锁,所以取了个折中值,先从50%里去分配。如果连50都分配不成功,那说明空间不够,所以从空间利用率25%的里面去分配,以此类推。池化是我们提升性能的手段之一,比如线程池、内存池以及接下来讲的对象池。池化的作用目的是减少创建和销毁对象的开销,提高并发处理能力,而且利用池化也可以降低 GC 压力。原创 2023-10-31 17:01:44 · 14 阅读 · 1 评论 -
Netty内存管理系统原理五
如果是fastGet,那么就把FastThreadLocalThread内部的InternalThreadLocalMap直接返回,如果为空就创建一个新的。DefaultThreadFactory在创建线程时默认使用的是FastThreadLocalThread,那么为什么叫Fast呢?如果是slowGet,那么就是把InternalThreadLocalMap放到了原来的ThreadLocal里。可以看到第15行使用的是与运算得到数组下标。原创 2023-10-31 17:01:05 · 16 阅读 · 1 评论 -
Netty内存管理系统原理四
当分配了一个8KB后,子页的maxOrder变为12,父页16KB变为11,所以满足memoryMap[id] > depth_of_id,已经分配了一个子页。memoryMap和depthMap在初始化的时候是一模一样的,所以memoryMap[id] = depth_of_id表示还没有被分配。当 memoryMap[id] = maxOrder + 1也就是=12时,表示已经分配完了。正常来说,32KB页应该等于13才对,但是实际却是12。depth_of_id作为参照物,是不变的。原创 2023-10-31 17:00:15 · 25 阅读 · 1 评论 -
Netty内存管理系统原理二
netty4.1.44之前的版本是jemalloc3,之后的版本都是经过优化之后的jemalloc4。原创 2023-10-31 16:59:32 · 18 阅读 · 1 评论 -
Netty内存管理系统原理一
设置为一个线程也可以,只不过这一个线程既处理连接事件,又处理读写事件,那有多个行不行呢?多个也可以,当调用一些方法时,或者处理timeEvent,就会调用next(),这时就增加了性能。Netty 提供一个专门用来操作缓冲区(即 Netty 的数据容器)的工具类。说白了就是一个工具类,使用门面模式,可以创建池化和非池化的ByteBuf,屏蔽了细节。如果使用业务线程调用了write方法,那么netty会检查是否在事件循环组中,如果不在,那么封装成一个任务丢到线程组的队列中。原创 2023-10-31 16:58:47 · 20 阅读 · 1 评论 -
Netty事件循环组源码六
tomcat的启动器Bootstrap,它是一个外部独立部署tomcat的启动器,Server.xml最终会返回一个配置好的Server对象,假如我的tomcat是嵌入到Spring中的, 那么我是不需要这个启动器的,因为Spring自己搞了一个启动器,来做了Server.xml的配置工作,这里主要看一下AbstractApplicationContext的refresh方法,正方法内会调用一个onRefresh();ChannelHandler原理。原创 2023-10-31 16:57:44 · 43 阅读 · 1 评论 -
Netty事件循环组原理五
AbstractEventExecutorGroup只是对接口进行了抽象实现,将部分方法的实现的委托给next()方法返回的EventExecutor,但是没具体实现next()方法。原创 2023-10-31 16:56:52 · 48 阅读 · 1 评论 -
Netty之IO原理三
一个程序里不同的执行路径,就是一个搞不定,多个一起搞。进程和线程有什么区别?进程是OS分配资源的基本单位,线程是执行调度的基本单位(比如执行main线程,执行socket线程,执行UI线程),分配资源最重要的是:独立的内存空间,线程调度执行(线程共享进程的内存空间,没有自己独立的内存空间)进程:在linux中也称为Task,是系统分配资源的基本单位,资源:独立的地址空间,内核数据结构(进程描述符),全局变量,数据段...原创 2023-10-31 16:54:48 · 19 阅读 · 1 评论 -
Netty之IO原理二
零拷贝这个概念需要上下文,比如DDD中的DCI(Data Context Interaction)数据上下文交互使用Scala的Trait可以将Humen继承SchoolTeacherRole或者是SchoolStudentRole等,使Human有了角色的特质,并且自动屏蔽了这个角色以外的特质。如果把边界转移到JVM内存这个领域,就是JVM的上下文,如果去掉数组到DirectByteBuffer的拷贝就是真正意义上的零拷贝。原创 2023-10-31 16:53:10 · 18 阅读 · 1 评论 -
Netty之IO原理一
JVM的时延针对的是用户程序和GC线程,一个请求到达了JVM到JVM把这个请求返回回去的时间叫JVM的时延。如果从线程的角度来看时延,那么有两种,一种是用户线程的时延、一种是GC线程的时延。GC线程的时延:当GC开始工作到结束所用的时间。用户线程的时延:从函数进入到执行完所用的时间,因为用户线程就执行函数。总的来说就是一个东西,从他开始做,到做完花费的时间。JSR-51 Expert Group专家组决定的。所以Buffer必须用抽象类。原创 2023-10-31 16:52:09 · 238 阅读 · 1 评论