让咱们天天都能看到本身的进步。老王带你打造最全的 Java 面试清单,认真把一件事作到最好。程序员
本文是前文《Java 最多见的 200+ 面试题》的第二个补充模块,第一模块为:《Java 200+ 面试题补充 ThreadLocal 模块》。web
1.Netty 是什么?
Netty 是一款基于 NIO(Nonblocking I/O,非阻塞IO)开发的网络通讯框架,对比于 BIO(Blocking I/O,阻塞IO),他的并发性能获得了很大提升。难能难得的是,在保证快速和易用性的同时,并无丧失可维护性和性能等优点。面试
2.Netty 的特色是什么?
- 高并发:Netty 是一款基于 NIO(Nonblocking IO,非阻塞IO)开发的网络通讯框架,对比于 BIO(Blocking I/O,阻塞IO),他的并发性能获得了很大提升。
- 传输快:Netty 的传输依赖于零拷贝特性,尽可能减小没必要要的内存拷贝,实现了更高效率的传输。
- 封装好:Netty 封装了 NIO 操做的不少细节,提供了易于使用调用接口。
3.什么是 Netty 的零拷贝?
Netty 的零拷贝主要包含三个方面:编程
- Netty 的接收和发送 ByteBuffer 采用 DIRECT BUFFERS,使用堆外直接内存进行 Socket 读写,不须要进行字节缓冲区的二次拷贝。若是使用传统的堆内存(HEAP BUFFERS)进行 Socket 读写,JVM 会将堆内存 Buffer 拷贝一份到直接内存中,而后才写入 Socket 中。相比于堆外直接内存,消息在发送过程当中多了一次缓冲区的内存拷贝。
- Netty 提供了组合 Buffer 对象,能够聚合多个 ByteBuffer 对象,用户能够像操做一个 Buffer 那样方便的对组合 Buffer 进行操做,避免了传统经过内存拷贝的方式将几个小 Buffer 合并成一个大的 Buffer。
- Netty 的文件传输采用了 transferTo 方法,它能够直接将文件缓冲区的数据发送到目标 Channel,避免了传统经过循环 write 方式致使的内存拷贝问题。
4.Netty 的优点有哪些?
- 使用简单:封装了 NIO 的不少细节,使用更简单。
- 功能强大:预置了多种编解码功能,支持多种主流协议。
- 定制能力强:能够经过 ChannelHandler 对通讯框架进行灵活地扩展。
- 性能高:经过与其余业界主流的 NIO 框架对比,Netty 的综合性能最优。
- 稳定:Netty 修复了已经发现的全部 NIO 的 bug,让开发人员能够专一于业务自己。
- 社区活跃:Netty 是活跃的开源项目,版本迭代周期短,bug 修复速度快。
5.Netty 的应用场景有哪些?
典型的应用有:阿里分布式服务框架 Dubbo,默认使用 Netty 做为基础通讯组件,还有 RocketMQ 也是使用 Netty 做为通信的基础。网络
6.Netty 高性能表如今哪些方面?
- IO 线程模型:同步非阻塞,用最少的资源作更多的事。
- 内存零拷贝:尽可能减小没必要要的内存拷贝,实现了更高效率的传输。
- 内存池设计:申请的内存能够重用,主要指直接内存。内部实现是用一颗二叉查找树管理内存分配状况。
- 串形化处理读写:避免使用锁带来的性能开销。
- 高性能序列化协议:支持 protobuf 等高性能序列化协议。
7.Netty 和 Tomcat 的区别?
Netty 和 Tomcat 最大的区别就在于通讯协议,Tomcat 是基于 http 协议的,他的实质是一个基于 http 协议的web容器,可是 Netty 不同,他能经过编程自定义各类协议,由于 Netty 可以本身编码/解码字节流,完成相似Redis 访问的功能,这就是 Netty 和 Tomcat 最大的区别。并发
8.Netty 中有那种重要组件?
- Channel:Netty 网络操做抽象类,它除了包括基本的 I/O 操做,如 bind、connect、read、write 等。
- EventLoop:主要是配合 Channel 处理 I/O 操做,用来处理链接的生命周期中所发生的事情。
- ChannelFuture:Netty 框架中全部的 I/O 操做都为异步的,所以咱们须要 ChannelFuture 的 addListener()注册一个 ChannelFutureListener 监听事件,当操做执行成功或者失败时,监听就会自动触发返回结果。
- ChannelHandler:充当了全部处理入站和出站数据的逻辑容器。ChannelHandler 主要用来处理各类事件,这里的事件很普遍,好比能够是链接、数据接收、异常、数据转换等。
- ChannelPipeline:为 ChannelHandler 链提供了容器,当 channel 建立时,就会被自动分配到它专属的 ChannelPipeline,这个关联是永久性的。
9.Netty 发送消息有几种方式?
Netty 有两种发送消息的方式:框架
- 直接写入 Channel 中,消息从 ChannelPipeline 当中尾部开始移动;
- 写入和 ChannelHandler 绑定的 ChannelHandlerContext 中,消息从 ChannelPipeline 中的下一个 ChannelHandler 中移动。
10.默认状况 Netty 起多少线程?什么时候启动?
Netty 默认是 CPU 处理器数的两倍,bind 完以后启动。异步
11.Netty 支持哪些心跳类型设置?
- readerIdleTime:为读超时时间(即测试端必定时间内未接受到被测试端消息)。
- writerIdleTime:为写超时时间(即测试端必定时间内向被测试端发送消息)。
- allIdleTime:全部类型的超时时间。
最后
- 若是你们想更深刻的了解 Netty,推荐一本很不错的掘金小册给你们(扫描二维码八折优惠)。

参考文档
http://www.javashuo.com/article/p-mswdtohs-hs.html分布式
http://www.javashuo.com/article/p-mzzlokqx-bq.html高并发
http://www.javashuo.com/article/p-yaypcpud-ba.html
https://www.jianshu.com/p/a199ca28e80d
http://www.javashuo.com/article/p-ffipsgac-kp.html
往期文章推荐
Java 最多见的 200+ 面试题
Java 200+ 面试题补充 ThreadLocal 模块
你真的懂 == 和 equals 的区别吗?
程序员精美简历Top榜—面试必备
程序员专属精美简历合集——第二弹