1

假设我有一个在 Java 中很长的内存地址,如果我知道内存地址是一个函数指针,我怎么能在这个地址调用函数?

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

4

1 回答 1

2

你不会,在纯 Java 中。这与 Java 的很多内容正好相反。如果你真的想的话,你可以用JNI来做。理想情况下,你会改变你的设计,这样你就不需要这样做了——在大多数情况下,这是一个非常奇怪的要求。

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

于 2013-10-18T15:36:15.937 回答