JDK1.4中新加入了NIO,引入了一种基于通道(Channel)和缓存区(Buffer)的I/O方式,它可以使用Native函数库直接分配堆外内存(native堆),然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中来回复制数据。
直接内存(Direct Memory),直接内存并不是运行时数据区的一部分,也不是Java虚拟机规范中定义的内在区域。它通过Unsafe类的allocateMemory()方法申请分配内存,底层会调用操作系统的的malloc函数。
关于Direct Buffers中的问题涉及到许多...
下面我将这些问题的答案罗列如下,回答全部来自互联网,外加自己的一些理解,如果有不到位的地方,敬请批评指正!
1.1 NIO 是如何分配Native Memory的
NIO 使用java.nio.ByteBuffer.allocateDirect()方法分配内存, 这种方式也就是通常所说的NIO direct memory 。ByteBuffer.allocateDirect()分配的内存使用的是本机内存而不是Java 堆上的内存,这也进一步说明每次分配内存时会调用操作系统的malloc()函数。
malloc函数分配内存主要是使用brk和mmap系统调用,brk是_edata指针堆中的地址往高地址推,mmap是在堆和栈之间找分配一块空闲的虚拟内存。brk和mmap分配的都不是物理内存,当第一次访问分配的虚拟内存

本文探讨了Netty中Direct Buffers的工作原理和分配内存的方式,解释了NIO如何使用Native Memory,并详细阐述了Direct Memory与堆内存的区别。内容涉及malloc、brk和mmap的使用场景,内核空间与用户空间的概念,以及DirectBuffer如何减少数据拷贝提高性能。
最低0.47元/天 解锁文章
8949

被折叠的 条评论
为什么被折叠?



