`
男人50
  • 浏览: 243844 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

DirectMemory 与 NIO

    博客分类:
  • NIO
 
阅读更多
本机内存DirectMemory,属于C Heap,可以通过参数-XX:MaxDirectMemorySize指定。
如果不指定,该参数的默认值为Xmx的值减去1个Survior区的值。如设置启动参数-Xmx20M -Xmn10M -XX:SurvivorRatio=8,那么申请20M-1M=19M的DirectMemory是没有问题的。


Channel是一个通道,网络数据通过Channel读取和写入。通道与流的不同之处在于通道是双向的,流只是在一个方向上移动(一个流必须是InputStream或者OutputStream的之类),而通道可以用于读、写或者两者同时进行。

因为Channel是全双工的,所以它可以比流更好的映射底层操作系统API。特别是在Unix网络编程模型中,底层操作系统的通道都是全双工的,同时支持读写操作。

实际上,Channel可以分为两大类:用于网络读写的SelectableChannel和用于文件操作的FileChannel。

应用程序中,不能直接对Channel进行读写操作,而必须通过Buffer来进行

NIO的Buffer还提供了一个可以直接访问系统物理内存,而不需要进行用户态和内核态之间的拷贝,即Direct Memory的类-DirectByteBuffe,是Direct I/O模式。
通过byteBuffer.allocateDirect(capacity)在DirectMemory上进行分配。

Buffer

Buffer有四个状态量: mask,position,limit和capacity

mask,the index to which its position will be reset when the reset method is invoked。就是说当reset方法调用后,buffer的position将会被置为mask的值,如果mask存在的话。

position,当前缓存区的位置

limit,缓存区的实际上限

capacity,缓存区的总容量上限

Buffer的几个方法:
clear,makes a buffer ready for a new sequence of channel-read or relative put operations: It sets the limit to the capacity and the position to zero.

就是说要往buffer写数据时,先执行buffer.clear(),使position=0,limit=capacity

flip,makes a buffer ready for a new sequence of channel-write or relative get operation:It sets the limit to the current position and then sets the position to zero.

就是说当从buffer中读数据写入channel时,先执行flip(),使limit=position,position=0

rewind,makes a buffer ready for re-reading the data that it already contains:It leaves the limit unchanged and sets the position to zero.

当要重新读取buffer中的内容时,先执行rewind(),将position=0.否则报java.nio.BufferUnderflowException异常
1
0
分享到:
评论

相关推荐

    NIO与零拷贝_javanio_nio和零拷贝_

    总的来说,Java NIO与零拷贝技术的结合,为开发者提供了更高效率、更低资源消耗的I/O处理手段,尤其在处理大数据和高并发场景时,其优势更为明显。理解并掌握这些知识,对于提升Java应用程序的性能至关重要。

    Java IO, NIO and NIO.2 原版pdf by Friesen

    and Direct Memory Access. Chapters 2 through 5 cover classic I/O APIs. You learn about the File and RandomAccessFile classes along with streams (including object serialization and externalization) and...

    Java-NIO-Programming-Cookbook(含源码)

    `DirectByteBuffer`是`ByteBuffer`的一个实现,它与`Non-Direct Buffer`(即堆缓冲区)有所不同。直接缓冲区在Java中使用JNI(Java Native Interface)直接在物理内存中分配,而不需要经过Java堆,这通常能提高性能...

    NIO需要了解的一些概念

    NIO中的通道和缓冲区机制充分利用了现代操作系统提供的DMA(Direct Memory Access)能力,使得数据可以直接从磁盘或网络硬件传输到内存,而无需CPU的干预,从而显著提高了I/O操作的性能。 #### 发散/汇聚 发散和...

    使用nio导出千万大数据

    4. **内存映射文件(Memory-Mapped File)**:NIO支持将文件直接映射到内存,通过直接缓冲区(Direct Buffer)进行访问,减少了磁盘I/O操作,加快了大数据的读写速度。 在导出千万级别的大数据时,我们可能需要考虑...

    Java版水果管理系统源码-java-advanced:java-高级

    Xmx、Xms、Xmn、Meta、DirectMemory、Xss 这些内存参数的关系。 进阶 从Classloader到模块化,动态加载的插件机制。 使用自定义Classloader机制,实现xlass的加载。 实现xlass打包的xar(类似class文件打包的jar)的...

    缓冲池 java

    Java提供了一些系统属性来调整缓冲池的大小,例如`-Djava.nio.channels.FileChannel.mapMode=normal`可以设置文件映射模式,`-Djava.nio.directMemory.page.size=16k`可以设置直接内存页大小。合理配置这些参数可以...

    堆外内存部分代码

    1. **直接内存(Direct Memory)**:Java的NIO(New Input/Output)库支持直接内存分配,数据可以直接在物理内存中读写,减少了Java对象之间的内存拷贝,提升了性能。使用`java.nio.DirectByteBuffer`类可以创建直接...

    Java IO合集

    6. 零拷贝技术:如直接缓冲区(Direct Buffers)和内存映射文件(Memory-Mapped Files),如何减少数据传输中的CPU和内存开销。 7. Socket通信:NIO中的SocketChannel和ServerSocketChannel,以及它们如何改进网络I/...

    Mycat-server-1.6-RELEASE源码

    支持非堆内存(Direct Memory)聚合计算(1.6) 支持PostgreSQL的native协议(1.6) 支持mysql和oracle存储过程,out参数、多结果集返回(1.6) 支持zookeeper协调主从切换、zk序列、配置zk化(1.6) 支持库内分表...

    Java堆外内存的使用Java开发Java经验技巧共5页

    堆外内存,也被称为直接内存(Direct Memory),是指不在JVM的堆内存中分配的内存,而是直接在操作系统的本地内存中进行分配。这样可以避免Java对象创建时的额外开销,例如垃圾收集的检查和内存分配的慢速。 1. **...

    11_直接内存.pptx

    直接内存(Direct Memory)在Java虚拟机(JVM)中是一个重要的优化手段,它与Java堆内存和栈内存不同,不直接由Java对象引用。直接内存的使用主要涉及到Java的NIO(New Input/Output)库,特别是ByteBuffer类。这个...

    JVM中[直接内存]的所有内容-pdf

    在JVM的内存模型中,直接内存(Direct Memory)是一个特殊的区域,虽然它并不属于标准的JVM运行时数据区,但对高性能的应用程序设计有着重要的影响。本文将深入探讨直接内存的概念、用途、优缺点以及如何进行配置。 ...

    JVM 32道面试题和答案.docx

    3. **直接内存(Direct Memory)**: - 不属于JVM的运行时数据区,但与JVM交互密切。通过NIO,可以直接在堆外分配内存,减少Java堆与Native堆之间的数据复制。直接内存受限于系统总内存和处理器寻址空间,过大可能...

    jVerbs: Java/OFED Integration for the Cloud

    jVerbs 是一个将 Java 与 OFED (OpenFabrics Enterprise Distribution) 集成的库,从而为云计算环境提供 RDMA (Remote Direct Memory Access) 技术的编程接口。IBM 在 2012 年发表了这篇文章,介绍了 jVerbs 的设计...

    Netty 25道面试题你和答案.docx

    4. **高性能**:Netty 在与其他NIO框架的比较中表现出色,综合性能最佳。 5. **稳定性**:修复了JDK NIO的已知问题,减少了开发中的困扰,保证了应用的稳定性。 6. **活跃社区**:频繁的版本更新和快速的BUG修复,...

    虚拟机学习笔记--周志明老师第三版

    * 直接内存(Direct Memory):用于 NIO 的缓冲区分配,避免在系统内存与 JVM 堆内存之间拷贝的开销。 * 线程私有内存(Thread Private Memory):包括程序计数器、JVM 栈、本地方法栈等。 2. 对象的内存布局 ...

    JAVA内存区域与内存溢出异常归类.pdf

    7. **直接内存(DirectMemory)**:非JVM规范定义的内存区域,但可以通过NIO等技术直接分配堆外内存。过度使用可能导致OutOfMemoryError。 **对象访问机制**: Java对象访问涉及到栈、堆和方法区。当创建一个对象,...

    Java界面版 内存地址转换的三种方式过程演示

    1. **直接内存访问(Direct Memory Access)** Java中的NIO(New IO)库允许程序在堆外分配内存,绕过Java内存管理,直接操作内存地址。通过`ByteBuffer`类,我们可以分配并访问直接内存,这通常用于高性能的数据交换...

Global site tag (gtag.js) - Google Analytics