防止Java重新定位对象
Prevent Java from relocating an object
在考虑调用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规范中没有指定派生内存地址的类型转换机制。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 使用 for_each 和 lambda 销毁已定位的对象
- 干净地破坏动态定位对象的向量
- 在创建共享对象时,不能使用针对未定义符号的重定位R_X86_64_PC32;使用-fPIC重新编译
- 在视频中定位对象所需的想法 - OpenCV 和 C++
- VTK 定位摄像机以用对象填充视口
- 首先在具有不同对象的 VBO 中定位
- Google协议缓冲区,在提供的流对象中向后重新定位IO头
- 我应该在我的所有对象需要时将我的服务定位器传递给他们吗
- c++对象的动态地址重定位
- 防止Java重新定位对象
- LRU缓存和快速定位对象通常使用哪些数据结构
- 特定对象的立体对应和三维定位(ROI)
- 在OpenGL中定位一个对象数组