网站建设过程有哪几个阶段,企业网站续费,花茶网站设计,软文网站模板为什么要看源码#xff1a;
1、提升技术功底#xff1a; 学习源码里的优秀设计思想#xff0c;比如一些疑难问题的解决思路#xff0c;还有一些优秀的设计模式#xff0c;整体提升自己的技术功底
2、深度掌握技术框架#xff1a; 源码看多了#xff0c;对于一个新技术… 为什么要看源码
1、提升技术功底 学习源码里的优秀设计思想比如一些疑难问题的解决思路还有一些优秀的设计模式整体提升自己的技术功底
2、深度掌握技术框架 源码看多了对于一个新技术或框架的掌握速度会有大幅提升看下框架demo 大致就能知道底层的实现技术框 架更新再快也不怕
3、快速定位线上问题 遇到线上问题特别是框架源码里的问题(比如bug), 能够快速定位这就是相比其他没看过源码的人的优势 4、对面试大有裨益 面试一线互联网公司对于框架技术一般都会问到源码级别的实现
5、知其然知其所以然 对技术有追求的人必做之事使用了一个好的框架很想知道底层是如何实现的
6、拥抱开源社区 参与到开源项目的研发结识更多大牛积累更多优质人脉
看源码方法:
1、先使用 先看官方文档快速掌握框架的基本使用
2、抓主线找一个demo 入手顺藤摸瓜快速静态看一遍框架的主线源码(抓大放小),画出源码主流程图切勿一开始就陷入源码的细枝 末节否则会把自己绕晕
3、画图做笔记 总结框架的一些核心功能点从这些功能点入手深入到源码的细节边看源码边画源码走向图并对关键源码的理解做 笔记把源码里的闪光点都记录下来后续借鉴到工作项目中理解能力强的可以直接看静态源码也可以边看源码边debug 源码执行过 程观察一些关键变量的值
4、整合总结所有功能点的源码都分析完后回到主流程图再梳理一遍争取把自己画的所有图都在脑袋里做一个整合 Netty 高并发高性能架构设计精髓
· 主从Reactor线程模型
· NIO 多路复用非阻塞
· 无锁串行化设计思想
· 支持高性能序列化协议
● 零拷贝(直接内存的使用) · ByteBuf内存池设计
· 灵活的TCP 参数配置能力 · 并发优化 无锁串行化设计思想 在大多数场景下并行多线程处理可以提升系统的并发性能。但是如果对于共享资源的并发访问处理不当会带来严重的锁竞争这最 终会导致性能的下降。为了尽可能的避免锁竞争带来的性能损耗可以通过串行化设计即消息的处理尽可能在同一个线程内完成期间 不进行线程切换这样就避免了多线程竞争和同步锁。NIO 的多路复用就是一种无锁串行化的设计思想(理解下Redis和Netty的线程模型) 为了尽可能提升性能 Netty采用了串行无锁化设计在IO线程内部进行串行操作避免多线程竞争导致的性能下降。表面上看串行化 设计似乎CPU 利用率不高并发程度不够。但是通过调整NIO 线程池的线程参数可以同时启动多个串行化的线程并行运行这种局部无锁化的串行线程设计相比一个队列-多个工作线程模型性能更优。 Netty的NioEventLoop 读取到消息之后直接调用ChannelPipeline的fireChannelRead (Object msg),只要用户不主动切换线程 一直 会由NioEventLoop调用到用户的Handler, 期间不进行线程切换这种串行化处理方式避免了多线程操作导致的锁的竞争从性能角度 看是最优的。
直接内存 直接内存 (Direct Memory) 并不是虚拟机运行时数据区的一部分也不是Java虚拟机规范中定义的内存区域某些情况下这部分内存也 会被频繁地使用而且也可能导致OutOfMemoryError 异常出现。Java里用DirectByteBuffer可以分配一块直接内存(堆外内存),元空间 对应的内存也叫作直接内存它们对应的都是机器的物理内存。 直接内存分配源码分析
public static ByteBuffer allocateDirect(int capacity) {return new DirectByteBuffer(capacity);
}DirectByteBuffer(int cap) { super(-1, 0, cap, cap);boolean pa VM.isDirectMemoryPageAligned();int ps Bits.pageSize();long size Math.max(1L, (long)cap (pa ? ps : 0));Bits.reserveMemory(size, cap);long base 0;try {base unsafe.allocateMemory(size);} catch (OutOfMemoryError x) {Bits.unreserveMemory(size, cap);throw x;}unsafe.setMemory(base, size, (byte) 0);if (pa (base % ps ! 0)) {address base ps - (base (ps - 1));} else {address base;}cleaner Cleaner.create(this, new Deallocator(base, size, cap));att null;
}public native long allocateMemory(long bytes);UNSAFE_ENTRY(jlong,Unsafe_AllocateMemory(JNIEnv *env,jobject unsafe,jlong size)) {Unsafewrapper(Unsafe_AllocateMemory);size_t sz (size_t)size;if(sz ! (julong)size || size 0){THROW_0(vmSymbols::java_lang_IllegalArgumentException());}sz round_to(sz,HeapWordSize);void *x os::malloc(sz,mtInternal);if(x NULL){THROW_0(vmSymbols::java_lang_OutofMemoryError());}return addr to java(x);
} 使用直接内存的优缺点
优点
· 不占用堆内存空间减少了发生GC的可能
· java 虚拟机实现上本地IO 会直接操作直接内存(直接内存系统调用硬盘/网卡),而非直接内存则需要二次拷贝(堆内 存直接内存系统调用硬盘/网卡)
缺点
● 初始分配较慢
· 没有JVM直接帮助管理内存容易发生内存溢出。为了避免一直没有FULLGC, 最终导致直接内存把物理内存耗完。我们可以 指定直接内存的最大值通过-XX:MaxDirectMemorySize 来指定当达到阈值的时候调用system.gc来进行一次FULL GC,间 接把那些没有被使用的直接内存回收掉。 ByteBuf内存池设计 随着JVM虚拟机和JIT即时编译技术的发展对象的分配和回收是个非常轻量级的工作。但是对于缓冲区Buffer(相当于一个内存块)情况 却稍有不同特别是对于堆外直接内存的分配和回收是一件耗时的操作。为了尽量重用缓冲区Netty提供了基于ByteBuf内存池的缓冲 区重用机制。需要的时候直接从池子里获取ByteBuf使用即可使用完毕之后就重新放回到池子里去。下面我们一起看下Netty ByteBuf的实现 可以看下netty的读写源码里面用到的ByteBuf内存池比如read源码NioByteUnsafe.read(); 继续看newDirectBuffer方法我们发现它是一个抽象方法由AbstractByteBufAllocator的子类负责具体实现代码如下 代码跳转到PooledByteBufAllocator的newDirectBuffer方法从Cache中获取内存区域PoolArena调用它的allocate方法进行内存分配 PoolArena的allocate方法如下 灵活的TCP参数配置能力 合理设置TCP参数在某些场景下对于性能的提升可以起到显著的效果例如接收缓冲区SO_RCVBUF和发送缓冲区SO_SNDBUF。如果设置不当对性能的影响是非常大的。通常建议值为128K或者256K。 Netty在启动辅助类ChannelOption中可以灵活的配置TCP参数满足不同的用户场景。 并发优化
volatile的大量、正确使用;
CAS和原子类的广泛使用
线程安全容器的使用
通过读写锁提升并发性能。
ByteBuf扩容机制
如果我们需要了解ByteBuf的扩容,我们需要先了解ByteBuf中定义的几个成员变量再从源码的角度来分析扩容。 总结Netty的ByteBuf需要动态扩容来满足需要扩容过程 默认门限阈值为4MB(这个阈值是一个经验值不同场景可能取 值不同)当需要的容量等于门限阈值使用阈值作为新的缓存区容量 目标容量如果大于阈值采用每次步进4MB的方式进行 内存扩张(需要扩容/4MB)*4MB扩张后需要和最大内存maxCapacity进行比较大于maxCapacity的话就用 maxCapacity,否则使用扩容值 目标容量如果小于阈值采用倍增的方式以64字节作为基本数值每次翻倍增长64 --128 -- 256直到倍增后的结果大于或等于需要的容量值。
补充handler的生命周期回调接口调用顺序
/*** 在channel的pipeline里如下handler:ch.pipeline().addLast(new LifeCycleInBoundHandler());* handler 的生命周期回调接口调用顺序* handlerAdded - channelRegistered - channelActive - channelRead - channelReadComplete - channelInactive - channelUnregistered - handlerRemoved** handlerAdded: 新建立的连接会按照初始化策略把handler添加到该channel的pipeline里面也就是channel.pipeline.addLast(new LifeCycleInBoundHandler)执行完成后的回调* channelRegistered: 当该连接分配到具体的worker线程后该回调会被调用。* channelActive: channel的准备工作已经完成所有的pipeline添加完成并分配到具体的线上上说明该channel准备就绪可以使用了。* channelRead: 客户端向服务端发来数据每次都会回调此方法表示有数据可读* channelReadComplete: 服务端每次读完一次完整的数据之后回调该方法表示数据读取完毕* channelInactive: 当连接断开时该回调会被调用说明这时候底层的TCP连接已经被断开了。* channelUnRegistered: 对应channelRegistered, 当连接关闭后释放绑定的worker线程* handlerRemoved: 对应handlerAdded, 将handler从该channel的pipeline移除后的回调方法。*/
public class LifecycleInBoundHandler extends ChannelInboundHandlerAdapter {Overridepublic void channelRegistered(ChannelHandlerContext ctx) throws Exception {System.out.println(channelRegistered: channel注册到NioEventLoop);super.channelRegistered(ctx);}Overridepublic void channelUnregistered(ChannelHandlerContext ctx) throws Exception {System.out.println(channelUnregistered: channel取消和NioEventLoop的绑定);super.channelUnregistered(ctx);}Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {System.out.println(channelActive: channel准备就绪);super.channelActive(ctx);}Overridepublic void channelInactive(ChannelHandlerContext ctx) throws Exception {System.out.println(channelInactive: channel被关闭);super.channelInactive(ctx);}Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {System.out.println(channelRead: channel中有可读的数据);super.channelRead(ctx, msg);}Overridepublic void channelReadComplete(ChannelHandlerContext ctx) throws Exception {System.out.println(channelReadComplete: channel读数据完成);super.channelReadComplete(ctx);}Overridepublic void handlerAdded(ChannelHandlerContext ctx) throws Exception {System.out.println(handlerAdded: handler被添加到channel的pipeline);super.handlerAdded(ctx);}Overridepublic void handlerRemoved(ChannelHandlerContext ctx) throws Exception {System.out.println(handlerRemoved: handler从channel的pipeline中移除);super.handlerRemoved(ctx);}
}
文章转载自: http://www.morning.zrkws.cn.gov.cn.zrkws.cn http://www.morning.nspzy.cn.gov.cn.nspzy.cn http://www.morning.jqtb.cn.gov.cn.jqtb.cn http://www.morning.tfrlj.cn.gov.cn.tfrlj.cn http://www.morning.lxbml.cn.gov.cn.lxbml.cn http://www.morning.bfsqz.cn.gov.cn.bfsqz.cn http://www.morning.tgtsg.cn.gov.cn.tgtsg.cn http://www.morning.kkjhj.cn.gov.cn.kkjhj.cn http://www.morning.nzcys.cn.gov.cn.nzcys.cn http://www.morning.zdwjg.cn.gov.cn.zdwjg.cn http://www.morning.dschz.cn.gov.cn.dschz.cn http://www.morning.ybgpk.cn.gov.cn.ybgpk.cn http://www.morning.wmdlp.cn.gov.cn.wmdlp.cn http://www.morning.jjnry.cn.gov.cn.jjnry.cn http://www.morning.mfsxd.cn.gov.cn.mfsxd.cn http://www.morning.mjbkp.cn.gov.cn.mjbkp.cn http://www.morning.yrnyz.cn.gov.cn.yrnyz.cn http://www.morning.gbjxj.cn.gov.cn.gbjxj.cn http://www.morning.tfcwj.cn.gov.cn.tfcwj.cn http://www.morning.rggky.cn.gov.cn.rggky.cn http://www.morning.yymlk.cn.gov.cn.yymlk.cn http://www.morning.pwmpn.cn.gov.cn.pwmpn.cn http://www.morning.bnkcl.cn.gov.cn.bnkcl.cn http://www.morning.pwggd.cn.gov.cn.pwggd.cn http://www.morning.rkmhp.cn.gov.cn.rkmhp.cn http://www.morning.qdscb.cn.gov.cn.qdscb.cn http://www.morning.rkgyx.cn.gov.cn.rkgyx.cn http://www.morning.lfgql.cn.gov.cn.lfgql.cn http://www.morning.gmgyt.cn.gov.cn.gmgyt.cn http://www.morning.tqrxm.cn.gov.cn.tqrxm.cn http://www.morning.kkwgg.cn.gov.cn.kkwgg.cn http://www.morning.dmkhd.cn.gov.cn.dmkhd.cn http://www.morning.rzbcz.cn.gov.cn.rzbcz.cn http://www.morning.tdcql.cn.gov.cn.tdcql.cn http://www.morning.lxmks.cn.gov.cn.lxmks.cn http://www.morning.ymbqr.cn.gov.cn.ymbqr.cn http://www.morning.tpdg.cn.gov.cn.tpdg.cn http://www.morning.jtjmz.cn.gov.cn.jtjmz.cn http://www.morning.ndyrb.com.gov.cn.ndyrb.com http://www.morning.xqxlb.cn.gov.cn.xqxlb.cn http://www.morning.ttfh.cn.gov.cn.ttfh.cn http://www.morning.lxctl.cn.gov.cn.lxctl.cn http://www.morning.ckrnq.cn.gov.cn.ckrnq.cn http://www.morning.kgxyd.cn.gov.cn.kgxyd.cn http://www.morning.wscfl.cn.gov.cn.wscfl.cn http://www.morning.rlqqy.cn.gov.cn.rlqqy.cn http://www.morning.ltrms.cn.gov.cn.ltrms.cn http://www.morning.qbzdj.cn.gov.cn.qbzdj.cn http://www.morning.wqngt.cn.gov.cn.wqngt.cn http://www.morning.gmmxh.cn.gov.cn.gmmxh.cn http://www.morning.pcqdf.cn.gov.cn.pcqdf.cn http://www.morning.nxbkw.cn.gov.cn.nxbkw.cn http://www.morning.cpgdy.cn.gov.cn.cpgdy.cn http://www.morning.ttaes.cn.gov.cn.ttaes.cn http://www.morning.jybj.cn.gov.cn.jybj.cn http://www.morning.tfwg.cn.gov.cn.tfwg.cn http://www.morning.kpypy.cn.gov.cn.kpypy.cn http://www.morning.wbxbj.cn.gov.cn.wbxbj.cn http://www.morning.dcdhj.cn.gov.cn.dcdhj.cn http://www.morning.qpmmg.cn.gov.cn.qpmmg.cn http://www.morning.dxhnm.cn.gov.cn.dxhnm.cn http://www.morning.ppbrq.cn.gov.cn.ppbrq.cn http://www.morning.xzjsb.cn.gov.cn.xzjsb.cn http://www.morning.bpp999.com.gov.cn.bpp999.com http://www.morning.rfbpq.cn.gov.cn.rfbpq.cn http://www.morning.wdrxh.cn.gov.cn.wdrxh.cn http://www.morning.dmjhp.cn.gov.cn.dmjhp.cn http://www.morning.dsgdt.cn.gov.cn.dsgdt.cn http://www.morning.qbrdg.cn.gov.cn.qbrdg.cn http://www.morning.xsymm.cn.gov.cn.xsymm.cn http://www.morning.leeong.com.gov.cn.leeong.com http://www.morning.dlurfdo.cn.gov.cn.dlurfdo.cn http://www.morning.ndtzy.cn.gov.cn.ndtzy.cn http://www.morning.spfq.cn.gov.cn.spfq.cn http://www.morning.sxcwc.cn.gov.cn.sxcwc.cn http://www.morning.bpmmq.cn.gov.cn.bpmmq.cn http://www.morning.dgsr.cn.gov.cn.dgsr.cn http://www.morning.fbhmn.cn.gov.cn.fbhmn.cn http://www.morning.ldsgm.cn.gov.cn.ldsgm.cn http://www.morning.smwlr.cn.gov.cn.smwlr.cn