网站的建立与运营,北京响应式网站如何开发,wordpress apply_filter,简单的公司网站系统一、首先是JavaDocument#xff1a; 直接与 非直接缓冲区 字节缓冲区要么是直接的#xff0c;要么是非直接的。如果为直接字节缓冲区#xff0c;则 Java 虚拟机会尽最大努力直接在此缓冲区上执行本机 I/O 操作。也就是说#xff0c;在每次调用基础操作系统的一个本机 I/…一、首先是JavaDocument 直接与 非直接缓冲区 字节缓冲区要么是直接的要么是非直接的。如果为直接字节缓冲区则 Java 虚拟机会尽最大努力直接在此缓冲区上执行本机 I/O 操作。也就是说在每次调用基础操作系统的一个本机 I/O 操作之前或之后虚拟机都会尽量避免将缓冲区的内容复制到中间缓冲区中或从中间缓冲区中复制内容。
直接字节缓冲区可以通过调用此类的 allocateDirect 工厂方法来创建。此方法返回的缓冲区进行分配和取消分配所需成本通常高于非直接缓冲区。直接缓冲区的内容可以驻留在常规的垃圾回收堆之外因此它们对应用程序的内存需求量造成的影响可能并不明显。所以建议将直接缓冲区主要分配给那些易受基础系统的本机 I/O 操作影响的大型、持久的缓冲区。一般情况下最好仅在直接缓冲区能在程序性能方面带来明显好处时分配它们。 二、allocateDirectpublic static ByteBuffer allocateDirect(int capacity)分配新的直接字节缓冲区。 新缓冲区的位置将为零其界限将为其容量其标记是不确定的。无论它是否具有底层实现数组其标记都是不确定的。 参数 capacity - 新缓冲区的容量以字节为单位 返回 新的字节缓冲区 抛出 IllegalArgumentException - 如果 capacity 为负整数 再看相关代码
ByteBuffer 的代码节选:
public static ByteBuffer allocateDirect(int capacity) { return new DirectByteBuffer(capacity);} DirectByteBuffer 的代码节选
DirectByteBuffer(int cap) { // package-private super(-1, 0, cap, cap, false); Bits.reserveMemory(cap); int ps Bits.pageSize(); long base 0; try { base unsafe.allocateMemory(cap ps); } catch (OutOfMemoryError x) { Bits.unreserveMemory(cap); throw x; } unsafe.setMemory(base, cap ps, (byte) 0); if (base % ps ! 0) { // Round up to page boundary address base ps - (base (ps - 1)); } else { address base; } cleaner Cleaner.create(this, new Deallocator(base, cap)); } java使用的是本地方法在管理相对应的内存 public native long allocateMemory(long _long); public native void setMemory(long _long, long _long1, byte _byte); public native void copyMemory(long _long, long _long1, long _long2); public native void freeMemory(long _long); 三、allocate 方法 分配一个HeapByteBuffer的实例其底层是byte数组。 在使用ByteBuffer 分配字节数组的时候要注意使用