Netty-面试

什么是Netty 为什么使用使用 有什么优点

Netty是基于java nio封装而来的同步非阻塞 通信框架;
优点是使用了nio,通信效率高,而且支持大量的并发通信;
nio是单线程 监控多个 channel注册到 selector;selector轮询检查selector是否准备好读写,准备后了进行读写;
nio 在linux内核做了磁盘到内存的映射,速度非常快
nio使用的是epoll多路复用机制,使用的数据结构是hash表,时间复杂度为
O(1),效率比poll和select的效率高;

Netty的核心组件有那些

Channel、回调、Future、事件和ChannelHandler

Channel是Java NIO的一个基本构造 一个 Channel 就是一个 socket

回调

一个回调其实就是一个方法,一个指向已经被提供给另外一个方法的方法的引用。

请谈一谈你对ByteBuf的认识

ByteBuf是一个封装传输字节的容器;
在Netty的世界里,有三种使用方式;
一种是申请ByteBuf池里的内存;
一种是申请堆空间的内存;
一种是申请堆外内存;
第一种申请ByteBuf池的思想和线程池类似,都是为了节约创建和销毁内存的开销;
第二种使用heap堆的内存会有一点性能上的损耗,因为执行的时候会将堆内存的内容复制到channel中,
第三种:使用堆外内存,它的分配和回收慢一点,不过读取的效率高;

你选择什么

在和设备进行通信的时候,会有大量的IO写入和写出,我使用DirectByteBuf;
eg:

后端一些业务代码,使用HeapByteBuf;

1. netty使用了什么设计模式

责任链模式

2. 如何处理沾包半包的问题

1 可以 用 header都中表明包的长度,根据长度进行接收;
2 使用使用分隔符;但是字符串中的分隔符需要转译;
3 固定长度,不够的空格进行补齐(可能浪费空间)

TCP 为什么有沾包半包的问题?

tcp 是字节流,默认发送包大小为1024k;如果报文分包很小,多个才能 填满1024的buffer;那么就会几个包一起发送就是沾包了;

如果报文分包很大,一个就有10兆,那么,就需要分包发送,也就是半包;

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值