- 博客(12)
- 收藏
- 关注
原创 Netty内存泄漏检测机制
广泛使用直接内存是Netty成为高效网络框架的原因之一。然而,直接内存释放并不受GC的控制,Netty中的对于直接内存的使用类似与C语言中(malloc、free),需要开发者手动分配和回收内存,而JVM GC只负责回收JAVA堆上的引用以及堆中内存。所有直接内存使用中,需要在JVM GC回收buf之前,手动调用release()方法去释放直接内存,否则存在内存泄漏。因此,在Netty中,在使用直...
2018-03-08 22:48:07 3476
原创 JDK动态代理源码分析
JDK动态代理建立在Java反射机制之上,在程序运行时对指定接口增强,降低接口的耦合性,被广泛应用Spring框架。本文将从Proxy的调用以及其缓存机制WeakCache介绍JDK动态代理的工作原理 在生成动态代理时,通常会调用Proxy的静态方法getProxyClass,在Proxy内部实际则是对getProxyClass0的简单包装private static Class<...
2018-03-08 00:12:53 307
原创 JUC ReentrantLock与ReentrantReadWriteLock
重入锁JUC中的重入锁ReentrantLock建立在AQS之上,其内部类Sync继承AQS,并实现其抽象方法,以完成可重入特性。实现可重入锁的需要注意的是:线程已经成功获取到锁才可重入;线程重入n次之后,历经释放n次,其他线程可以请求并获取到锁。在JUC重入锁的设计中提供了公平与非公平锁两种实现。其区别主要在于获取锁的顺序(公平锁有序),由于公平锁的有序性可能引起上下文切换,所以公平锁的吞吐...
2018-03-03 10:20:36 294
原创 JUC之AQS源码分析
队列同步器(AbstractQueuedSynchronizer)作为构建锁及其他同步器的基础框架,它通过volatile状态变量及FIFO队列实现线程获取或等待资源的逻辑,JUC中的同步组件(ReentrantLock、ReentrantReadWriteLock、CountDownLatch等)均基于此基础上实现。 AbstractQueuedSynchronizer的源码中,定义如下模板方...
2018-03-03 10:19:53 462
原创 Netty内存池之PoolArea
关于Netty内存池管理已经介绍了PoolChunk以及PoolSubPage来管理内存池。然后从应用层调用来看,应用层序并未直接去调用PoolChunk或PoolSubPage的allocate/free方法去管理内存,当我们通过PooledByteBufAllocator去分配操作内存时,它将内存的管理职责委托给PoolArea,本文将介绍PoolArea是如何管理内存的。 其成员变量如下:
2018-02-04 22:54:12 648
原创 Netty内存池之PoolSubPage
在前一篇中刚刚分析了PoolChunk的内存管理策略,简单回顾下PoolChunk的分配原则: 1) 平衡二叉树维护标记内存块的使用情况 2) > 8k, PoolChunk直接在二叉树上标记并分配内存 3) 本文接着PoolChunk中的内存申请private long allocateSubpage(int normCapacity) { int d = maxO
2018-02-04 15:45:16 447
原创 Netty内存池之PoolChunk
Netty内存池之PoolChunk为了避免频繁内存分配拉低系统性能,Netty4引入了内存池管理以提高内存分配效率。PoolChunk作为内存分配的核心类,将内存划分为块(Chunk)来管理。它通过构建一个平衡二叉树用以标记内存的使用情况,以来分配或释放内存。 1)PoolChunk有2048个Page(叶子节点)构成,每个Page默认大小为8k 2)每个父节点管理内存的为子节点的2
2018-02-04 00:41:11 651
原创 多路复用模型之epoll
作为多路复用IO模型,epoll致力于解决select与poll设计缺陷以提升系统并发能力。 (1) 并发效率不随文句柄树上升而线性下降: epoll避免了select模型中对所有每次所有文件描述符句柄轮询。它的底层采用红黑树记录所有文件句柄,并将活跃的连接存放至链表中,在处理IO事件时,只需遍历该链表即可。 (2) mmap加速内核与用户态拷贝: 无论select,poll还是epoll
2017-11-24 23:07:30 234
原创 IO多路复用模型之Select
**IO多路复用模型之Select** 在Unix/C中,Socket相关的函数操作都是阻塞式的,在单线程下服务端只能处理一个客户端请求。采用多线程处理客户端请求,虽然能充分发挥多核CPU能力,但是在客户端连接过多,并发度维持相对较高水平时,多线程引起线程的上下文切换将导致系统效率低下。Select多路复用模型的核心思想,在单线程下处理多客户端连接,Unix/C提供了相应函数库,具体
2017-11-23 23:09:50 365
原创 Netty启动过程分析
在介绍基于NIO Netty服务器启动过程之前,先来说说其相应的核心模块:引导类(ServerBootstrap,BootStrap)线程池(NioEventGroupLoop异步IO)Channel(与JAVA NIO中Channnel类似)ChannelPipeline(与Channel对应的流水线)Handler(Channel中可以指定相应的进行编解码等相应业务处理)如果对Cha
2017-11-23 16:20:53 1162
原创 Netty线程模型
Reactor模型单线程Reactor多线程Reactor主从ReactorNetty线程模型Reactor模型 一般编写的网络框架以IO操作为主,将IO操作分割为相对独立的事件模块。大多数都是基于Reactor模式进行设计和开发,Reactor模式基于事件驱动,特别适合处理海量的I/O事件。1 单线程ReactorReactor单线程模型:所有的IO操作都在同一个NIO线程上面完成,
2017-11-03 11:37:20 372
原创 NioEventLoop源码分析
NioEventLoop源码分析NioEventLoop源码分析1 轮询IO事件2 处理IO事件3 处理任务队列31 转移队列任务32 定器检查截至任务截至时间在Netty开发中,一般异步IO事件处理采用NioEventLoopGroup作为线程池,而NioEventLoop为线程池中单个线程,作为系统任务执行单元。接下来将从源码分析Netty是如何处理任务的。
2017-10-26 15:10:57 574
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人