Netty Channel 源码分析
前面,我们大致了解了 Netty 中的几个核心组件。今天我们就来先来介绍 Netty 的网络通信组件,用于执行网络 I/O 操作 —— Channel。
Netty 版本:4.1.30
概述数据在网络中总是以字节的形式进行流通。我们在进行网络编程时选用何种传输方式编码(OIO、NIO 等)决定了这些字节的传输方式。
在没有 Netty 之前,为了提升系统的并发能力,从 OIO 切换到 NIO 时,需要对代码进行大量的重构,因为相应的 Java NIO 与 IO API 大不相同。而 Netty 在这些 Java 原生 API 的基础上做了一层封装,对用户提供了高度抽象而又统一的 API,从而让传输方式的切换不在变得困难,只需要直接使用即可,而不需要对整个代码进行重构。
Netty Channel UMLnetty channel 族如下:
整个族群中,AbstractChannel 是最为关键的一个抽象类,从它继承出了 AbstractNioChannel、AbstractOioChannel、AbstractEpollChannel、LocalChannel、Emb ...
Netty 核心组件介绍
前面,我们学习了 Netty 的基本 原理和架构 ,今天我们来大致了解一下 Netty 中的各个组件。
同我们 前面 学习 IO 与 NIO 一样的套路,我们先通过 echo 服务 demo 来学习 netty 的使用。
开发环境
JDK >= 8
Netty 4.1.29.Final
编写 Echo Server 代码Netty 服务端的开发主要有以下两个步骤:
至少有一个 ChannelHandler —— 这个主要用于处理从 client 端接受到的信息,是主要的业务逻辑处理类。
Bootstrapping —— 用于配置服务的启动代码。最简单的就是,监听一个端口。
实现 EchoServerHandler 逻辑服务端用于处理入站的网络请求,因此我们需要实现接口类 ChannelInboundHandler,它里面定义了用于
处理入站请求的一些接口。由于我们这个例子比较简单,只需要用到它的几个方法即可,因此我们的实现类只需要继承子类 ChannelInboundHandlerAdapter 即可,它默认实现了 ChannelInboundHandler ...
Netty 基本原理介绍
此前,我们学习了 Java NIO API 的使用,也学习了几种常见的 IO 模型 以及传统阻塞 I/O 服务模型和 Reactor 线程模型 。你体会到直接去使用 Java NIO API 去进行网络编程会非常麻烦,除了要对 Java NIO API 掌握的非常熟练之外,还需要掌握多线程等其他技术。不过这些问题,Netty 都可以帮我们解决。
Netty 是一个 NIO 客户端服务器框架,可以快速轻松地开发协议服务器和客户端等网络应用程序。 它极大地简化了 TCP 和 UDP 套接字服务器等网络编程的复杂度。
『快速而又简单』并不意味着最终的应用程序会受到可维护性或性能问题的影响。 Netty 经过精心设计,具有丰富的协议,如 FTP,SMTP,HTTP 以及各种二进制和基于文本的传统协议。 因此,Netty 成功地找到了一种在不妥协的情况下实现易于开发,性能,稳定性和灵活性的方法。
服务端 IO 编程传统的 BIO 编程网络编程的基本模型是 Client/Server 模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的 IP 地址和监听端口),客户端通 ...
好用的工具清单
发现好东西,遇见好…… 分享自己日常工作与生活中经常使用的工具、app 以及网站。
实体物件
一级
二级
类目
电子产品
苹果
MacBook ProiPhoneiPad ProApple WatchiMac Pro
阅读
Kindle Oasis
应用程序
一级
二级
类目
制图
流程图 / UML / 原型
OmniGraffleStarUMLAxure RP 9
图片处理
截图拼接
Tailor
个人管理
时间管理
aTimelogger2
任务管理
OmniFocusThings
精力管理
冥想:Insight Timer 专注:Forest 睡眠:SleepTown
运动健身
Keep
团队协作
项目管理
OmniPlan
文档协作
TeambitionTower石墨文档
记录
写作
TyporaOmniOutlinerevernoteBearMindNode讯飞语录
阅读
电子书籍管理
iBookscalibre
安全
账号密码安全
authy1 ...
Java8 新特性介绍
Java 8 于 2014 年 3 月份发布,新版本增添很多不错的特性,本篇文章我们一起纵览一下这些新特性,后面的文章我们将会一一详细讨论。
Java8 介绍促使 Java 做出重大改变的动力主要来源于:
代码可读性
多核运行
代码可读性Java 代码非常的啰嗦冗长,导致了代码可读性的下降,换句话说,需要很多额外的代码来解释一段很小的内容。例如,现在有个需求,要按照发票金额的数量倒序排序发票列表。在 Java 8 之前,你可能需要这么处理:
12345Collections.sort(invoices, new Comparator<Invoice>() { public int compare(Invoice inv1, Invoice inv2) { return Double.compare(inv2.getAmount(), inv1.getAmount()); }});
而在 Java8 中,你只需要这样即可:
1invoices.sort(comparingDouble(Invoice::getAmount).reversed ...
Concurrent Mark Sweep(CMS)
前面 我们介绍了 Serial GC 与 Parallel GC 的使用与配置,今天我们来介绍 Concurrent Mark Sweep(CMS) 收集器。
概述CMS (Concurrent Mark and Sweep 并发 - 标记 - 清除),是一款基于并发、使用 mark-sweep (标记 - 清理) 算法的垃圾回收算法,只针对老年代进行垃圾回收。CMS 收集器工作时,尽可能让 GC 线程和用户线程并发执行,以达到降低 STW 时间的目的。
CMS 收集器的主要目的:减少老年代垃圾收集的停顿时间。主要通过两种手段来达成此目的:
不对老年代进行整理,而是使用空闲列表 (free-list) 来管理内存空间的回收。
在 mark-sweep 阶段采用并发方式与用户线程一起执行。
启动参数:
1XX:+UseConcMarkSweepGC
控制参数
-XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用 CMS + 串行收集器。
-XX:+ParallelCMSThreads:设定 CMS 的线程数量。
-XX:+CMSIni ...
Serial GC 与 Parallel GC
前面 我们学习了 JVM 中几种常用的 GC 算法,今天我们来学习一下 JVM 中实现这些算法的垃圾收集器。大多数 JVM 都需要使用两种不同的 GC 算法 —— 一种用来清理年轻代,另一种用来清理老年代。
分类我们可以从以下几个不同的角度来对 GC 收集器进行分类:
按线程数分,可以分为串行垃圾回收器和并行垃圾回收器。
串行垃圾回收器一次只使用一个线程进行垃圾回收;
并行垃圾回收器一次将开启多个线程同时进行垃圾回收。在并行能力较强的 CPU 上,使用并行垃圾回收器可以缩短 GC 的停顿时间。
按照工作模式分,可以分为并发式垃圾回收器和独占式垃圾回收器。
并发式垃圾回收器与应用程序线程交替工作,以尽可能减少应用程序的停顿时间;
独占式垃圾回收器 (Stop the world) 一旦运行,就停止应用程序中的其他所有线程,直到垃圾回收过程完全结束。
按碎片处理方式可分为压缩式垃圾回收器和非压缩式垃圾回收器。
压缩式垃圾回收器会在回收完成后,对存活对象进行压缩整理,消除回收后的碎片;
非压缩式的垃圾回收器不进行这步操作。
按工作的内存区间,又可分为新生代垃圾回收器 ...
GC 算法介绍
前面我们了解了 Java7 与 Java8 的内存模型,接下里我们要学习 JVM 是如何回收对象所占用的内存的,本文先为你介绍三种常用的 GC 算法。
概述常用的 GC 算法主要有三种:标记-清除算法、标记-整理算法、复制算法。还有一种分代收集算法,这种算法无非就是对内存的不同区域使用前面三种不同的算法。
这三种 GC 算法总体而言,都专注于干两件事情:
标记所有存活的对象。在垃圾收集中有一个叫做 标记 (Marking) 的过程专门干这件事。
清除所有死对象。这三种算法的区别就在于清理死对象的实现方式上。
标记可达对象 (Marking Reachable Objects)现代 JVM 中所有的 GC 算法,第一步都是找出所有存活的对象,如图所示:
GC Roots前面 讲了 GC 中 根 (GC Roots) 的概念:
指的是指向对象指针的” 起点”。
可作为 GC Roots 的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如栈帧中的本地变量表)中,主要包括:
在虚拟机栈(栈帧中的本地变量表)中应用的对象,譬如各个线程被调用的方法堆栈中使用 ...
GC 基本概念
在了解 GC 算法 之前,我们需要先来了解一些与算法有关的基本概念。
目录
GC 的定义
对象 / 头 / 域
指针
mutator
堆
活动对象 / 非活动对象
分配 (allocation)
分块 (chunk)
根 (root)
吞吐量 (throughput)
最大暂停时间
堆使用效率
访问局部性
GC 的定义GC 是 Garbage Collection 的简称,也就是垃圾收集
Garbage Collector:垃圾收集器
Minor GC:小型 GC
Major GC:大型 GC
Full GC:完全 GC(为了清晰起见,一般直接译为 Full GC)
对象 / 头 / 域对象在 GC 的世界中,对象表示的是 “通过应用程序利用的数据的集合”。对象配置在内存空间里。GC 根据情况将配置好的对象进行移动或销毁操作。因此,对象是 GC 的基本单位。
对象由头(header)和域(field)构成。在对象内部,头之后存在 1 个及 1 个以上的域。如图 1.1 所示:
头用于保存对象本身信息,主要含有以下信息:
对象的大小
对象的种类
域对象使用 ...
Java8 MetaSpace 介绍
前面 我们学习了 Java7 的内存模型,重点了解了它的 Runtime Data Area,今天我们要来学习一下 Java8 HotSpot (TM) VM 内存模型,看看它与 Java7 VM 存在哪些差异。
与 Java7 相比较,Java8 VM 的一个重大更新:完全移除永久代(PermGen),取而代之的为元空间(Metaspace)。
![Java8 VM MetaSpace](https://img.i7years.com/blog/Java8 VM MetaSpace.png)
为什么要移除 PermGen
来源:http://openjdk.java.net/jeps/122
Jon Masamitsu 对此的解释如下:
A goal for removing perm gen was so that users do not have to think about correctly sizing it.
Set MetaspaceSize to a value larger than the default, if you know that yo ...