外贸网站定制,凡科快图app,大学营销型网站建设实训课程,镇江还有什么网站吗直接缓冲区与非直接缓冲区的概念#xff1a;1#xff09;非直接缓冲区#xff1a;通过 static ByteBuffer allocate(int capacity) 创建的缓冲区#xff0c;在JVM中内存中创建#xff0c;在每次调用基础操作系统的一个本机IO之前或者之后#xff0c;虚拟机都会将缓冲区的…直接缓冲区与非直接缓冲区的概念1非直接缓冲区通过 static ByteBuffer allocate(int capacity) 创建的缓冲区在JVM中内存中创建在每次调用基础操作系统的一个本机IO之前或者之后虚拟机都会将缓冲区的内容复制到中间缓冲区或者从中间缓冲区复制内容缓冲区的内容驻留在JVM内因此销毁容易但是占用JVM内存开销处理过程中有复制操作。 非直接缓冲区写入步骤 1.创建一个临时的直接ByteBuffer对象。2.将非直接缓冲区的内容复制到临时缓冲中。3.使用临时缓冲区执行低层次I/O操作。4.临时缓冲区对象离开作用域并最终成为被回收的无用数据。 2直接缓冲区 通过 static ByteBuffer allocateDirect(int capacity) 创建的缓冲区在JVM内存外开辟内存在每次调用基础操作系统的一个本机IO之前或者之后虚拟机都会避免将缓冲区的内容复制到中间缓冲区或者从中间缓冲区复制内容缓冲区的内容驻留在物理内存内会少一次复制过程如果需要循环使用缓冲区用直接缓冲区可以很大地提高性能。虽然直接缓冲区使JVM可以进行高效的I/O操作但它使用的内存是操作系统分配的绕过了JVM堆栈建立和销毁比堆栈上的缓冲区要更大的开销。 直接缓冲区与非直接缓冲区的区别字节缓冲区要么是直接的要么是非直接的。如果为直接字节缓冲区则 Java 虚拟机会尽最大努力直接在此缓冲区上执行本机 I/O 操作。也就是说在每次调用基础操作系统的一个本机 I/O 操作之前或之后虚拟机都会尽量避免将缓冲区的内容复制到中间缓冲区中或从中间缓冲区中复制内容。直接字节缓冲区可以通过调用此类的 allocateDirect() 工厂方法来创建。此方法返回的缓冲区进行分配和取消分配所需成本通常高于非直接缓冲区。直接缓冲区的内容可以驻留在常规的垃圾回收堆之外因此它们对应用程序的内存需求量造成的影响可能并不明显。所以建议将直接缓冲区主要分配给那些易受基础系统的本机 I/O 操作影响的大型、持久的缓冲区。一般情况下最好仅在直接缓冲区能在程序性能方面带来明显好处时分配它们。直接字节缓冲区还可以通过 FileChannel 的 map() 方法 将文件区域直接映射到内存中来创建。该方法返回MappedByteBuffer 。 Java 平台的实现有助于通过 JNI 从本机代码创建直接字节缓冲区。如果以上这些缓冲区中的某个缓冲区实例指的是不可访问的内存区域则试图访问该区域不会更改该缓冲区的内容并且将会在访问期间或稍后的某个时间导致抛出不确定的异常。字节缓冲区是直接缓冲区还是非直接缓冲区可通过调用其 isDirect() 方法来确定。提供此方法是为了能够在性能关键型代码中执行显式缓冲区管理。直接缓冲区与非直接缓冲区区别图形示意 转载于:https://www.cnblogs.com/yy3b2007com/p/7262453.html