java - 如何使用长内存地址调用 Java 方法?

标签 java memory jvm function-pointers directmemory

假设我有一个 Java 中很长的内存地址,如果我知道该内存地址是一个函数指针,我如何调用该地址处的函数?

我对此感兴趣的原因是为了处理堆外对象。 我要在直接字节缓冲区中创建对象,该对象不会受到 GC 的影响。 这将允许我取消 GC 暂停时间,因为如果我不在堆上创建任何对象,GC 将永远不会运行。

最佳答案

在纯 Java 中你不会。这与 Java 的许多内容正好相反。您可以使用JNI来做到这一点如果你真的想的话。理想情况下,您应该更改您的设计,这样您就不需要这样做 - 在大多数情况下,这是一个相当奇怪的要求。

既然您已经编辑了这篇文章,而且您似乎基本上想要比虚拟机的垃圾收集器做得更好,我强烈建议您避免这种情况。这可能需要付出巨大的努力,并导致系统非常脆弱,每个环境都需要不同的二进制文件。无论如何,您都很难将堆外值用作真正的对象,因为此时 JVM 很可能会对数据做出各种假设。如果您只关心原始值,则始终可以使用一个大字节数组来充当“原始”存储,并使用适当的包装器代码在该数组中的数据和原始值之间进行转换......所有这些都无需 JNI。

关于java - 如何使用长内存地址调用 Java 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19453495/

相关文章:

java - 使用 Java DOM 解析 XML

java - 方法覆盖是否总是运行时多态性?

java - 将 InputStream 写入文件的内存友好方式

java - Java 程序运行时非堆内存使用情况的细微差别

Java/JVM(热点): Is there a way to save JIT performance gains at compile time?

java - 为什么在 Windows 上运行 jstack 会出现 'unable to attach to 64 bit process' 错误?

java - 我们应该使用 Elasticsearch 来实现业务逻辑吗?

java - Set 是否有任何线程安全类

c - 为什么我可以修改C中的const指针?

Java 字节码规范