当前位置: 首页 > 面试题库 >

有没有一种方法可以仅使用Java从指针创建直接ByteBuffer?

丌官星渊
2023-03-14
问题内容

还是我必须有一个调用env-> NewDirectByteBuffer(buffer,size)的JNI帮助函数?


问题答案:

我要做的是创建一个普通的DirectByteBuffer并更改其地址。

Field address = Buffer.class.getDeclaredField("address");
address.setAccessible(true);
Field capacity = Buffer.class.getDeclaredField("capacity");
capacity.setAccessible(true);

ByteBuffer bb = ByteBuffer.allocateDirect(0).order(ByteOrder.nativeOrder());
address.setLong(bb, addressYouWantToSet);
capacity.setInt(bb, theSizeOf);

从这一点开始,您可以访问引用基础地址的ByteBuffer。我这样做是为了访问网络适配器上的内存以实现零拷贝,并且工作正常。

您可以直接为您的地址创建一个DirectByteBuffer,但这比较晦涩。

一种替代方法是使用Unsafe(仅适用于OpenJDK / HotSpot JVM和本机字节顺序)

Unsafe.getByte(address);
Unsafe.getShort(address);
Unsafe.getInt(address);
Unsafe.getLong(address);


 类似资料:
  • 我已经在我的服务器上安装了docker,这是linux机器,我是从另一个系统(windows)编码,是否有任何直接从服务器创建dockerized图像?这是我正在使用的文件。 是否可以用服务器的路径或任何其他方式替换,以便直接从服务器创建映像,而不需要将文件复制并粘贴到服务器,然后创建映像??

  • 问题内容: 如果通过创建缓冲区,则该内存将位于Java堆之外。有没有一种方法可以以跨平台的方式测量应用程序中此类内存的使用情况,类似于我可以使用and 来测量Java堆使用情况的方法? 问题答案: 您可以使用反射来获取Java 7的OpenJDK / HotSpot。没有独立于平台的方式,它仅通过ByteBuffer.allocateDirect()向您显示用法,而没有其他分配本地内存的方式。 另

  • 问题内容: 通过,我们可以创建/修改连接的参数,但是我想知道是否可以通过API进行相同的操作,以便可以以编程方式设置连接 似乎它只处理实际连接到实例,而不是将其保存到列表中。似乎应该已经实现了一个功能,但是我不确定在哪里可以找到该特定功能的文档。 问题答案: 连接实际上是一个模型,可以用来查询和插入新连接

  • 问题内容: 给定一个结构: 以及带有结构名称的字符串 要么 如何从字符串名称而不是结构创建结构的实例?我的想法是,我将使用链接到二进制文件中的所有结构创建一个应用程序,但根据字符串创建运行时实例。(某种元元) 问题答案: Go中没有类型的中央注册表,因此在一般情况下您无法提出要求。 您可以使用从字符串到对应于每种类型的值的映射来手动建立自己的注册表来支持这种功能。例如: 然后,您可以创建如下类型的

  • 问题内容: 嗨,我想使用WMI类来查找应用程序和产品信息。但是问题是我想使用Java或任何脚本语言(如python,javascript或perl)。我听说过JWMI,这可能是一个选择。有人可以帮我吗??? 问题答案: JavaScript和Java不是一回事。 JavaScript Windows脚本宿主(WSH)下提供了JavaScript。有了它,访问WMI相当容易: jWMI(Java)

  • 问题内容: 我一直在寻找使用CSS编写的类似Google Chrome的标签,但是找不到。 我正在尝试复制外观,以便在Web应用程序或网站中使用它。 问题答案: 是的,用css3 艾夫(Ive)发表了一篇关于如何对其进行深入研究的博客,可悲的是,除非您使用图像,否则诺努斯将无法继续工作 编辑: 删除了对redeyeoperations的旧引用,现在导致其链接服务器场。这是一个较轻的版本,它在第三方