Netty ByteBuf入门

Netty ByteBuf入门,第1张

ByteBuf由一段地址空间,一个read index和一个write index组成。两个index分别记录读写进度,省去了NIO中ByteBuffer手动调用flip和clear的烦恼。

通过上图可以很好的理解ByteBuf的数据划分。writer index到capacity之间的部分是空闲区域,可以写入数据;reader index到writer index之间是已经写过还未读取的可读数据;0到reader index是已读过可以释放的区域。

三个index之间的关系是:reader index <= writer index <= capacity

ByteBuf根据其数据存储空间不同有可以分为三种:基于JVM堆内的,基于直接内存的和组合的。

堆内受JVM垃圾收集器的管辖,使用上相对安全一些,不用每次手动释放。弊端是GC是会影响性能的;还有就是内存的拷贝带来的性能损耗(JVM进程到Socket)。

直接内存则不受JVM的管辖,省去了向JVM拷贝数据的麻烦。但是坏处就是别忘了释放内存,否则就会发生内存泄露。相比于堆内存,直接内存的的分配速度也比较慢。

最佳实践:在IO通信的线程中的读写Buffer使用DirectBuffer(省去内存拷贝的成本),在后端业务消息的处理使用HeapBuffer(不用担心内存泄露)。

通过hasArray检查一个ByteBuf heap based还是direct buffer。

ByteBuf提供了两个工具类来创建ByteBuf,分别是支持池化的Pooled和普通的Unpooled。Pooled缓存了ByteBuf的实例,提高性能并且减少内存碎片。它使用Jemalloc来高效的分配内存。

如果在Channel中我们可以通过channel.alloc()来拿到ByteBufAllocator,具体它使用Pool还是Unpool,Directed还是Heap取决于程序的配置。

markReaderIndex和resetReaderIndex是一个成对的 *** 作。markReaderIndex可以打一个标记,调用resetReaderIndex可以把readerIndex重置到原来打标记的位置。

discardReadByte可以把读过的空间释放,这时buffer的readerIndex置为0,可写空间和writerIndex也会相应的改变。discardReadBytes在内存紧张的时候使用用,但是调用该方法会伴随buffer的内存整理的。这是一个expensive的 *** 作。

clear是把readerIndex和writerIndex重置到0。但是,它不会进行内存整理,新写入的内容会覆盖掉原有的内容。

派生 *** 作会产生一个新的ByteBuf实例。这里的新指得是ByteBuf的引用是新的所有的index也是新的。但是它们共用着一套底层存储。派生函数:

如果想要复制一个 全新 的ByteBuffer请使用copy,这会完全的复制一个新的ByteBuf出来。

引用计数记录了当前ByteBuf被引用的次数。新建一个ByteBuf它的refCnt是1,当refCnt == 0时,这个ByteBuf即可被回收。

引用技术主要用于内存泄露的判断,Netty提供了内存泄露检测工具。通过使用参数 -Dio.netty.leakDetectionLevel=${level} 可以配置检测级别:

很多时候需要从ByteBuf中查找特定的字符,比如LineBasedFrameDecoder需要在ByteBuf中查找'\r\n'。ByteBuf提供了简单的indexOf这样的函数。同时也可以使用ByteProcesser来查找。

以下 gist 提供了一些example。

《Netty权威指南》百度网盘pdf最新全集下载:

链接: https://pan.baidu.com/s/12As1T1Nt7yP3nZ23QkeL0w

?pwd=8h75 提取码: 8h75

简介:《Netty指南》是异步非阻塞通信领域的经典之作,基于第一版本Netty5.0编写,是首本深入介绍Netty原理和架构的技术书籍,也是作者多年实战经验的总结和浓缩。在理论方面,讲解了Netty的逻辑架构模型和核心类库的设计原理,而且对Netty在大数据、互联网、游戏行业的应用进行了深入分析;实战方面,从个Netty入门程序到私有协议栈的设计和开发,通过实际例程,由浅入深地对Netty的核心API和类库的功能和用法进行了细致讲解。  

Java是一门涵盖比较广的编程语言,自学起来相对比较困难,网上有视频资料,可以下载来看,下面我把Java入门需要学的一些东西做一个整理,仅供参考,有问题的话可以继续问我。

第一阶段:JavaEE初级

JDK的下载安装配置、Eclipse开发工具介绍、Java基本程序的编译运行、关键字、标示符、注释、常量、变量、数据类型、进制转换、数据类型转换、各种运算符的使用、各种判断循环语句的使用、函数的使用、数组的使用

面向对象入门、用Java来描述对象、局部变量和成员变量、Java对象内存分析、匿名对象、封装、构造函数、Main函数详解、继承、重写、抽象类、接口、多态、内部类、异常、包机制、JAR包

StringBuffer类、Date和Calendar类,System类、Runtime类、Math类,正则表达式、基本数据类型包装类

集合类(Collection)、List、ArryList、LinkList、Vector、迭代器、Set、HashSet、TreeSet、LinkedHashSet、Map、HashTable、HashMap、TreeMap、泛型等各种数据集合的分析和使用

异常处理、多线程基础、IO系统、网络编程、Java反射机制、Java注解、JavaSE 8.0新特性SVN介绍、SVN服务端的安装及使用、SVN客户端的安装及使用、SVN团队开发注意事项

第二阶段:JavaEE进阶

认识Web前端、常见标签及用途、选择器及分类、浮动、定位、表格和表单、HTML进阶、HTML5基础、HTML5新技术特点WebSocket、地理定位、canvas

CSS的作用、CSS的各种选择器、行内样式、内部样式、外部样式、选择器及样式的优先级问题、盒子模型、层的浮动、游览器调试工具的使用、采用DIV+CSS设计页面

BOM浏览器对象模型、DOM文档对象模型、JS *** 作CSS、JS *** 作DOM、JS *** 作DIV、protoype、js基于对象编程

jQuery基本技术、jQuery使用插件、jQuery EasyUI、jQuery mobile

Bootstrap基础知识、Bootstrap预定义的CSS样式、Bootstrap内置的布局组件、Bootstrap支持的JavaScript插件、Less、Sass、Chart.JS、Two.JS、实际使用Bootstrap

MySQL5.5/5.6数据库、navicat客户端软件,基本建表、插入数据、修改数据、查询数据 *** 作、数据备份与移植

JDBC连接MySQL数据库,CRUD *** 作

XML的概念与基本作用、XML的基本语法、XML的约束模式、DTD、Schema、名称空间。XML解析介绍、DOM4J解析XML、XPath的使用

HTTP协议详解,Web服务器的工作原理、Tomcat的安装与启动运行、Tomcat的体系结构、在Tomcat中配置Web虚拟目录与发布Web应用程序的方式、设置目录的默认网页、使用Tomcat配置虚拟主机、WAR文件生成与使用

安装使用MyEclipse进行JavaEE程序开发和调试,以及和Tomcat的集成

什么是Servlet、Servlet接收客户端请求信息、Servlet响应客户端信息、Servlet的生命周期、Servlet过滤器和AOP编程;Servlet监听器

什么是JSP、JSP的内置对象、透析JSP的本质、JSTL+EL、JSP内置对象与状态管理

Tomcat和JDBC连接池配置、JDBC的事务、JSP整合进行分页,条件查询

MVC核心思想、MVC基本入门JSP+Servlet+Bean整合

AJAX技术基础、XMLHttpRequest对象详解、jQuery的AJAX、AJAX技术调试技巧、JSON介绍、JSON语法、JSON类库

LoggingAPI日志管理、JUnit单元测试技术、Ant打包

第三阶段:JavaEE高级

SpringWeb MVC介绍、Web MVC应用、Spring WebMVC架构、Spring MVC入门程序、非注解处理器映射器和适配器、注解开发处理器映射器和适配器、Spring MVC整合Mybatis、RequestMapping、Controller方法返回值、参数绑定(简单类型、pojo、包装类型、数组、集合类型等)、SpringMVC与Struts2区别、Spring MVC上传图片、json数据交互、Validation、异常处理器、RESTful支持、拦截器

Mybatis介绍、单独使用jdbc编程问题总结、Mybatis架构、Mybatis入门程序、Mybatis开发Dao、SqlMapConfig.XML配置、ParameterType输入映射、ResultType及ResultMap输出映射、动态SQL、商品订单数据模型、关联查询(一对一、一对多)、Mybatis与Spring整合、Mybatis逆向工程

Spring框架介绍,IoC思想、DI依赖注入、Bean的实例方式、Bean种类、Bean作用域范围、依赖注入、p命名空间、SpEL?Spring表达式、注解装配Bean、整合Junit测试、Web开发集成Spring、AOP思想、使用AspectJ切面编程、JdbcTemplate模板使用、C3P0数据源配置、DBCP数据源配置、声明式事务管理、SSH整合

Struts2框架介绍、工作原理与架构分析、6大配置文件分析、Struts.XML详解及使用,使用通配符定义action、动态方法调用,ActionContext及ServletActionContext使用,模型驱动ModelDriven、属性驱动、Struts2文件上传、默认拦截器分析、自定义拦截器、OGNL表达式、值栈ValueStack分析及 *** 作、Struts2标签

学会基于Spring?Boot实现减少XML配置,快速搭建Java Web项目,减少Java开发的笨重的工作量,减少项目周期

Maven的介绍、Maven的构建、Maven的依赖管理、Maven和Eclipse的整合、Maven构建SSM应用

Oracle基础管理,SQL语言、序列、索引、视图对象、数据备份与移植

第四阶段:JavaEE熟练

基于JFreeChart生成饼图、曲线图、柱状图

基于iText生成pdf文件

基于POI组件生成EXCEL文件

Quartz定时任务管理器以及和Spring的继承

HttpClient/HTMLParser,采用HttpClient如何抓取网页、GET提交和POST提交、采用HTMLParser解析HTML。

NIO介绍、netty入门

Activiti工作流:掌握工作流的基本概念,什么叫流程定义、什么叫流程实例、什么叫任务、工作流中的相关概念将如何应用

异构系统整合方案,JNI、CORBA、基于Web?Services的中国电信消息系统规范介绍、SOAP、WSDL、UDDI、如何采用CXF/Axis2开发WebService服务器端和客户端的相关知识

git介绍、git版本管理。

掌握Linux的常用命令,熟悉Linux上下文编辑器,掌握Linux的文件管理控制等

Jboss\Weblogic企业级JavaEE应用服务器安装、配置

基本的Apache和Tomcat整合,最新的Tomcat和Apache集群和负载均衡配置

掌握Nginx负载均衡及和Tomcat的整合

掌握ActiveMQ消息队列的安装以及和Java的集成、JMS接口规范

MySQL主从配置、MySQL分库分表实际演练、MySQL集群配置

MongoDB安装,基本使用,和Java集成、Spring框架集成

Redis安装,基本使用,和Java集成、Spring框架集成

安卓基础开发:了解Android和开发环境搭建、Activity、UI布局和UI组件、AsyncTask异步任务、网络应用、资讯APP实战基于JFreeChart生成饼图、曲线图、柱状图


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11315886.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存