假设我有一个Java中的内存地址,如果我知道内存地址是一个函数指针,我怎么能在这个地址调用该函数?
我对此感兴趣的原因是处理堆外对象。 我将在直接字节缓冲区中创建对象,这些缓冲区不受GC的限制。 这将允许我否定GC暂停时间,因为如果我不在堆上创建任何对象,GC将永远不会运行。
答案 0 :(得分:2)
你不会,在纯Java中。这与Java的很多相反。如果你真的想,你可以使用JNI这样做。理想情况下,你会改变你的设计,所以你不需要这样做 - 在大多数情况下这是一个非常奇怪的要求。
现在您已经编辑了帖子,看起来您基本上想要比VM的垃圾收集器做得更好,我会强烈建议您避免这种情况。它可能需要花费大量精力并导致一个非常脆弱的系统,它需要为每个环境提供不同的二进制文件。无论如何,您很难将堆外值用作真正的对象,因为此时JVM可能会对数据做出各种假设。如果您只关心原始值,那么您总是可以使用一个大字节数组作为“原始”存储,并使用适当的包装代码在该数组中的数据和原始值之间进行转换......所有这些都没有JNI。