ByteBuffer.allocateDirect 与 allocate 方法

一、首先是JavaDocument:
    直接与 非直接缓冲区
字节缓冲区要么是直接的,要么是非直接的。如果为直接字节缓冲区,则 Java 虚拟机会尽最大努力直接在此缓冲区上执行本机 I/O 操作。也就是说,在每次调用基础操作系统的一个本机 I/O 操作之前(或之后),虚拟机都会尽量避免将缓冲区的内容复制到中间缓冲区中(或从中间缓冲区中复制内容)。

直接字节缓冲区可以通过调用此类的 allocateDirect 工厂方法来创建。此方法返回的缓冲区进行分配和取消分配所需成本通常高于非直接缓冲区。直接缓冲区的内容可以驻留在常规的垃圾回收堆之外,因此,它们对应用程序的内存需求量造成的影响可能并不明显。所以,建议将直接缓冲区主要分配给那些易受基础系统的本机 I/O 操作影响的大型、持久的缓冲区。一般情况下,最好仅在直接缓冲区能在程序性能方面带来明显好处时分配它们。

 

二、allocateDirect
public 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 分配字节数组的时候,要注意使用!

现代控制理论(4)——李雅普诺夫稳定性理论 文章目录 阅读详情

相关推荐

Stable Diffusion 模型分享:Beautiful Realistic Asians(美丽真实的亚洲人)

Beautiful Realistic Asians(BRA)模型是由作者自己训练而成的一个独立模型,它是一个真实模型,并且是一个针对亚洲人训练的模型,可以生成非常漂亮的亚洲小姐姐。条目内容类型大模型基础模型SD 1.5来源CIVITAI作者文件名称文件大小1.99GB。

水滴的博客 2113

ByteBufferallocateallocateDirect

在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类。ByteBuffer提供了两种静态实例方式:  Java代码   public static ByteBuffer allocate(int capacity)   public static ByteBuffer alloca...

weixin_33726313的博客 950

郑州大学学位论文LaTeX模板系统:本科研究生通用版

本系列毕业设计实践资料系经长期系统化整理而成,内容涵盖完整项目流程关键技术解析。文档结构严谨、案例详实,既适用于高校毕业设计课题研究,亦可作为专业技能提升的指导手册或工作实践中的技术参考范本。所有付费资源用户均可通过站内信获取本人整理的其他关联学习资料。资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!

JVM笔记(8)—— 直接内存

直接内存不是虚拟机运行时数据区的一部分,是在运行时数据区外、直接向系统申请的内存空间。通常,访问直接内存的速度会优于堆,读写性能更好。因此,出于性能考虑,读写频繁的场合可能会考虑使用直接内存。Java的NIO库允许Java程序使用直接内存,用于数据缓冲区。普通IO写需要从用户缓存空间copy到内核缓存空间再copy到磁盘(读就是反过来),而NIO是直接磁盘进行交互,因此速率更快,适合对大文件的读写操作。

m0_56602092的博客 1177

ByteBuffer.allocateDirect函数分析

在NIO中,有两种分配字节的方法: 在堆中初始缓冲区 public static ByteBuffer allocate(int capacity) { if (capacity < 0) throw createCapacityException(capacity); return new HeapByteBuffer(capacity, capacity); } 以及 在堆外创建缓冲区 public static ByteBuffer al

dlx_handsome的博客 1739

Java中ByteBufferallocate方法allocateDirect方法的区别和选用原则

选择使用哪种方式取决于应用的需求和性能特征:适用于较小的缓冲区,对内存占用不太敏感的情况。由于是在Java堆上分配,垃圾回收器能够管理这部分内存,但可能会有一些性能开销。适用于需要较大缓冲区或对性能要求较高的情况。由于是在本地内存上分配,可能减少了一些垃圾回收器的开销,但在分配和释放直接缓冲区时可能涉及到一些本地资源的操作。在使用时需要谨慎,因为它可能占用较多的本地内存,过度使用可能导致本地内存耗尽。在选用这两种技术方案中哪一种的时候需要根据具体的应用场景和需求权衡两者之间的取舍。

Shujie 1340

ByteBuffer.allocate()ByteBuffer.allocateDirect()方法的区别。

在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类。ByteBuffer提供了两种静态实例方式:  public static ByteBuffer allocate(int capacity)   public static ByteBuffer allocateDirect(int capacit

一行两行的世界. 2万+

ByteBuffer.allocate()ByteBuffer.allocateDirect()方法的区别

在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类。ByteBuffer提供了两种静态实例方式:  public static ByteBuffer allocate(int capacity)   public static ByteBuffer allocateDirect(int capacity)   为什...

jiangbr的博客 2464

8、ByteBuffer方法演示2(allocate堆内存和allocateDirect直接内存))

ByteBuffer方法演示2(allocate堆内存和allocateDirect直接内存))Allocate:java堆内存:读写效率低,收到gc的影响(因为我们的java对象也是存在堆内存的)!!!Gc的影响堆内存:想象一个场景,其中我在对内存中写入了数据,这个时候我们的java虚拟机出现了内存不足,就触发了gc垃圾回收器。这向buffer写入数据的方法(channel的read和buffer的put)Allocate:java堆内存。向buffer分配空间的方法。而直接内存是不受gc影响的。

分享JAVA/ Python/ Ts学习路上的一些笔记,不足之处多多见谅。 757

ByteBuffer.allocate()/ByteBuffer.allocateDirect()/JNI DETECTED ERROR IN APPLICATION: jarray was NULL

在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类。ByteBuffer提供了两种静态实例方式: public static ByteBuffer allocate(int capacity) public static ByteBuffer allocateDirect(int capacity)

我的学生时代 1889

使用NIO中ByteBuffer.allocateDirectByteBuffer.allocate后性能的确不一样。

package com.bxf.NIOTest; import java.io.FileInputStream; import java.io.FileOutputStream; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class allocateDirectTest { ...

baoxiaofei的博客 901

ByteBufferallocateDirectallocate的区别

Java的NIO(New IO)中的ByteBufferallocateDirect()allocate()的区别 allocateDirect public static ByteBuffer allocateDirect(int capacity) 分配新的直接字节

3769

ByteBufferallocateallocateDirect区别

ByteBufferallocateallocateDirect区别 在Java中当我们要对数据进行更底层的操作时,通常是操作数据的字节(byte)形式,这时常常会用到ByteBuffer这样一个类。ByteBuffer提供了两种静态实例方式: public static ByteBuffer allocate(int capacity) public static Byte...

weixin_33711641的博客 188

ByteBuffer.allocateDirect()

https://blog.csdn.net/seebetpro/article/details/49184305

qq_32450111的博客 1421

ByteBuffer.allocate()和ByteBuffer.allocateDirect在性能上的差异

allocateDirect public static ByteBuffer allocateDirect(int capacity)分配新的直接字节缓冲区。 新缓冲区的位置将为零,其界限将为其容量,其标记是不确定的。无论它是否具有底层实现数组,其标记都是不确定的。 参数: capacity - 新缓冲区的容量,以字节为单位 allocate public static By

qq_36176985的博客 500

一道java题关于ByteBuffer.allocate()和ByteBuffer.allocateDirect

证明ByteBuffer.allocate()和ByteBuffer.allocateDirect在性能上的差异写出代码,望高人指点 ------------------------------------- allocateDirectpublic static ByteBuffer allocateDirect(int capacity)分配新的直接字节缓冲区。 新缓冲区的位置将为零,其...

kalogen的专栏 969

java ByteBuffer和byte 数组相互转换

public static void main(String[] args) throws UnsupportedEncodingException { ByteBuffer byteBuffer = ByteBuffer.allocateDirect(10); byteBuffer.put("Test".getBytes("UTF-8")); byteBuffer.flip(); System.out.println(Arrays.toSt

weixin_43709937的博客 3328

java中静态缓冲区,java中allocatedirectallocate字节缓冲区的联系区别

一、字节缓冲区方法allocateDirect()和allocate()简介当Java程序员在编写相应的Java应用时一般都不会用到字节,所以大家对byte字节的了解也是知之甚少,但是当我们随着工作经验的增加年限的增长想要对Java底层有更深入的了解时,这时我们发现Java底层在操作数据时都是以字节的表现形式进行操作。jvm和操作系统操作字节时又喜欢使用缓冲区来提升效率,因此我们就会了解到Java...

weixin_39566493的博客 973

[JAVA学习笔记-60]ByteBuffer的分配方式的比较

public static ByteBuffer allocate(int capacity)   public static ByteBuffer allocateDirect(int capacity)   方法1从JVM进程的堆上分配内存,分配的ByteBuffer可被GC标记并回收; 方法2调用系统的native方法分配内存,分配的ByteBuffer对象不能被GC回收,需要   

sinat_36263171的博客 2067
上一篇: 关于Unix哲学
下一篇: 开博了
nba520pz
博客等级 码龄18年 1粉丝 17原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值