防止Java重定位对象

时间:2014-07-21 22:23:48

标签: java c++ pointers jvm

在考虑调用java对象时,如何防止java更改对象的位置?在C ++中,一个人要求JVM引用一个对象,然后将它转换为指针。所以问题很明显,你的指针不再有效。有什么想法吗?

到目前为止,在查看答案时,让我澄清一下。据我所知,当java创建一个对象时,它提供了一个引用(相当于一个指针),该引用将所有其他对象引向其实际的数据和方法。从C ++中调用java时,你必须输入对指针的引用,从而获得对象的内存位置。

Java尽可能干净地维护其内存池以优化执行/堆碎片等。这样做可以很好地将对象移动到不同的内存池,从而更改引用所指向的实际内存地址(内部,在jvm)并更新引用列表,以便所有其他java对象仍然可以正确访问相同的对象。

我的问题是在C ++中,因为它们不是C ++运行时和JVM之间的契约,所以将引用转换为指针,该指针现在指向内存中的物理地址。如果JVM在优化过程中重定位对象,那么C ++中的指针现在在长时间运行的java程序中是无效的吗?

我希望这有助于澄清这个问题。

1 个答案:

答案 0 :(得分:1)

似乎询问JNI方法。假设是这种情况,JVM在该方法的持续时间内将JNI参数对象或由JNI方法创建的对象“引脚”到同一地址。如果要在JNI调用之间保存JNI对象引用并使其在下次调用期间有效,则必须使用GlobalRef。

编辑我已经按照编辑的方式回答了您的问题,但是:

  

在C ++中,我们要求JVM引用一个对象,然后将它转换为指针。

不正确,也不是这样:

  

从C ++中调用java时,你必须输入对指针的引用,因此你在内存中有对象的位置

或者这个:

  

您将引用转换为指针,该指针现在指向内存中的物理地址。

您永远不会拥有JNI中对象的地址。您有一个由JVM提供的不透明值作为jobject.它包含的内容是完全未指定的,并且在JNI规范中的任何位置都没有指定用于派生内存地址的类型转换机制。