JVM 如何处理本机代码

Gee*_*eek 5 jvm native

考虑这样一种情况,我必须从我的 Java 程序调用 C++ 代码。C++ 代码创建了数千个对象。这些动态对象存储在哪里?我怀疑是在 JVM 堆中,因为本机代码将是与 JVM 相同的进程的一部分。

如果是,Java 垃圾收集器线程的规则是否适用于 C++ 代码的对象?

Con*_*lls 5

对于第一个问题,C++ 将使用自己的运行时来分配资源,这与 JVM 无关 - JVM 不知道该内存分配器中的任何活动。

对于第二个问题,Java垃圾收集器不会GC C++分配的内存。您必须确保 Java 包装器启动内存释放。在 java GC 回收对象之前,运行时会调用该finalize()方法。默认的继承自java.lang.Object,基本上什么都不做。您可以覆盖它并将其用作钩子来启动释放手动管理的内存。

  • 堆内存当然位于进程的地址空间内。在幕后,JVM 和 C++ 运行时都使用 sbrk() 等系统调用从操作系统请求内存块。只要它们保持在它们所请求的块的范围内,它们就不会互相绊倒。 (2认同)