防止Java重新定位对象

Prevent Java from relocating an object

本文关键字:定位 对象 Java 新定位 防止      更新时间:2023-10-16

在考虑调用java对象时,如何防止java更改对象的位置?在c++中,向JVM请求对对象的引用,然后将其类型转换为指针。所以问题很明显,你的指针不再有效。知道的吗?

在查看到目前为止的答案时,让我澄清一下。据我所知,当java创建一个对象时,它提供了一个引用(相当于指针),这个引用将所有其他对象引向它的实际数据和方法。当在c++中调用java时,你必须将引用类型强制转换为指针,这样你就有了对象在内存中的位置。 Java尽可能干净地维护内存池,以优化执行/堆碎片等。在这样做时,它很可能将对象移动到不同的内存池中,从而改变引用点的实际内存地址(在jvm内部)并更新引用列表,以便所有其他java对象仍然可以正确访问相同的对象。

我的问题是,在c++中,由于c++运行时和JVM之间没有契约,您将引用强制转换为指向内存中物理地址的指针。如果JVM在优化过程中重新定位对象,那么c++中的指针现在在长时间运行的java程序中是否无效?

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

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

编辑我已经按编辑方式回答了你的问题,但是这个:

在c++中,向JVM请求对对象的引用,然后将其类型转换为指针。

是不正确的,下面也不正确:

在c++中调用java时,你必须将引用类型强制转换为指针,这样你就有了对象

在内存中的位置。

或:

将引用强制转换为指向内存中物理地址的指针。

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