摘要:
1、serverhandler package server; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.exte 阅读全文
摘要:
在网络传输过程中粘包和半包中经常出现的现象。 在TCP传输中,客户端发送消息时,实际上是将数据写入TCP的缓存,此时数据的大小和缓存的大小就会造成粘包和半包的原因。 例如: 客户端给服务端发送了两条消息ABC和DEF,服务端这边的接收会有多少种情况呢?有可能是一次性收到了所有的消息ABCDEF,有可 阅读全文
摘要:
1、为何高并发下容易oom 1)首先我们了解当执行垃圾回收的时候,会导致进程暂停,从而使我们的程序卡死;进程长时间暂停,又会导致大量的请求积压等待处理,垃圾回收刚刚结束,更多的请求立刻涌进来,迅速占满内存,再次被迫执行垃圾回收,进入了一个恶性循环。如果垃圾回收的速度跟不上创建对象的速度,还可能会产生 阅读全文
摘要:
1、协议抽象实体 1 package protocal.model; 2 3 import lombok.Data; 4 5 /** 6 * @author liupengr 7 * @date 2020/2/12 18:21 8 */ 9 @Data 10 public abstract clas 阅读全文
摘要:
1、序列化接口 1 package serializer.service; 2 3 /** 4 * 序列化接口 5 * 6 * @author liupengr 7 * @date 2020/2/12 18:17 8 */ 9 public interface Serializer { 10 11 阅读全文
摘要:
目前有很多通用的序列化实现,比如java和go都内置了序列化实现,还有一些开源的序列化框架,比如Google 的 Protobuf、Kryo、Hessian 等, 以及像json,二进制这种标准会的数据格式也可以作为序列化的实现。 首先我们选用数列化实现有哪几个维度呢? 序列化后数据要有良好的可读性 阅读全文
摘要:
1、同步网络IO模型 网络IO模型分两段,一个write,一个read,write操作我们不需要考虑,这里我们看read操作。 接受线程会一直阻塞,当有数据到来的时候,操作系统会先把数据写入接收缓存,然后给接收数据的线程发一个通知, 线程收到通知后结束等待,开始读取数据。处理完这一批数据后,继续阻塞 阅读全文
摘要:
1、用户空间和内存空间 为了不让用户线程直接操作内核,保护内核的安全,操作系统将虚拟空间分为两部分,一部分为内核空间,一部分为用户空间。 针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(从虚拟地址0x 阅读全文
摘要:
Q:为何要采用异步编程 A:异步编程首先不会节约线程,因为异步操作都会重新开一个线程。异步编程是提高了CPU的使用率,采用同步编程的方式,整个服务器的所有线程大部分都没有在工作,而是在等待。因为线程同步操作 要等整个事件处理完成才能提交,所以CPU的利用率很低;当采用异步编程,线程不需要等待,减少时 阅读全文
摘要:
java线程池 1、以下是ThreadPoolExecutor参数完备构造方法: public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueu 阅读全文