无锁化的串行线程设计相比一个队列-多个工作线程模型性能更优。
Netty的NioEventLoop读取到消息之后,直接调用ChannelPipeline的fireChannelRead(Objectmsg),只要用户不主动切换线程,一直
会由NioEventLoop调用到用户的Handler,期间不进行线程切换,这种串行化处理方式避免了多线程操作导致的锁的竞争,从性能角度
看是最优的。
直接内存
直接内存(DirectMemory)并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域,某些情况下这部分内存也
会被频繁地使用,而且也可能导致OutOfMemoryError异常出现。Java里用DirectByteBuffer可以分配一块直接内存(堆外内存),元空间
对应的内存也叫作直接内存,它们对应的都是机器的物理内存。
1 /**
2 *直接内存与堆内存的区别
3 */
4 publicclassDirectMemoryTest{
5
6 publicstaticvoidheapAccess(){
7 longstartTime=System.currentTimeMillis();
8 //分配堆内存
9 ByteBufferbuffer=ByteBuffer.allocate(1000);
10 for(inti=0;i<100000;i++){
11 for(intj=0;j<200;j++){
12 buffer.putInt(j);
13 }
14 buffer.flip();
15 for(intj=0;j<200;j++){
16 buffer.getInt();
17 }
18 buffer.clear();
19 }
20 longendTime=System.currentTimeMillis();
21 System.out.println("堆内存访问:"+(endTime‐startTime)+"ms");
22 }
23
24 publicstaticvoiddirectAccess(){
25 longstartTime=System.currentTimeMillis();
26 //分配直接内存
27 ByteBufferbuffer=ByteBuffer.allocateDirect(1000);
28 for(inti=0;i<100000;i++){
29 for(intj=0;j<200;j++){
30 buffer.putInt(j);
31 }
32 buffer.flip();
33 for(intj=0;j<200;j++){
34 buffer.getInt();
35 }
36 buffer.clear();
37 }
38 longendTime=System.currentTimeMillis();