c++ - 固定不安全指针

标签 c++ pointers garbage-collection java-native-interface unsafe

我正在设计一个 JNI 接口(interface),用于将字符串参数从 Java 传递到 C++。我需要高性能并且已经能够使用 Direct ByteBuffer 和 String.getBytes() 相当好地做到这一点,但是将字符串传递给 C/C++ 的代价仍然相当高。我最近读到有关 Open JDK 的 Unsafe 类的信息。 This excellent page让我开始了,但我发现 Unsafe 很糟糕,但可以理解的是,文档记录很差。

我想知道,如果我使用 Unsafe 类获取指向字符串的指针并将其传递给 C++,是否存在在输入 C++ 代码之前对象已移动的风险?甚至在 C++ 执行时?或者这些由不安全代码提供的地址是否以某种方式固定?如果它们没有固定,这些不安全指针有什么用?

最佳答案

Unsafe 并不意味着与 JNI 互操作。因此,通过 Unsafe 获得的可能会随时更改(甚至与您的 C++ 并行)。

JNI API 能够将对象固定在内存中以访问数组内容(在 HotSpot JVM 中它会阻塞 GC,因此可能对 GC 暂停持续时间产生负面影响)。

特别是,Get*ArrayElements 会固定数组,直到您明确执行 Release*ArrayElements。 GetStringChars 的工作方式类似。

Direct ByteBuffer 持有指向堆外内存缓冲区的指针,因此该缓冲区不会移动,您可以为 native 代码访问它。

关于c++ - 固定不安全指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25813320/

相关文章:

c++ - Object Mat(args); 之间的区别 - 内存分配明智 -和 Object *Mat = new Mat(args);在 C++ 中?

c++ - 从模板化 vector 函数中删除 cv-qualifier

c++ - boolean 变量的最佳大小是多少

c - 这段 C 代码的作用是什么

java - Java 桌面应用程序的内存分析

c++ - 在运行时决定一个应用程序属于控制台/windows 子系统

c - 在 Main 之外操作数组

c - 指针到指针在 C 中如何工作? (你什么时候可以使用它们?)

java - 为什么对 WeakRef 对象的 WeakReference 没有被垃圾回收?

c# - 如何强行释放MemoryStream占用的内存?