【问题标题】:Does Garbage Collector run in JVM created from C++?垃圾收集器是否在从 C++ 创建的 JVM 中运行?
【发布时间】:2021-01-02 09:34:11
【问题描述】:

我有一个 C++ 代码库,我在其中使用 JNI 创建一个 JVM,并偶尔与一个用 Java 实现的库进行交互。我很好奇,在这个用例中,Java 的垃圾收集器是否仍能可靠地运行和清理?

我在网上找到的大部分关于 JNI 的信息似乎都是关于“相反”的用例,人们通常似乎主要使用 Java 代码,有时通过 JNI 与本机代码交互。对于这样的用例,我发现例如以下online

在大多数情况下,不再在范围内的本地引用的自动垃圾收集可防止内存泄漏。当本机线程返回 Java(本机方法)或从 JVM 分离(调用 API)时,会发生这种自动垃圾收集。如果不发生自动垃圾回收,则可能发生本地引用内存泄漏。如果本地方法没有返回到 JVM,或者使用 Invocation API 的程序没有从 JVM 分离,则可能会发生内存泄漏。

我不确定在这种情况下“返回 Java”到底是什么意思。只是偶尔从 C++ 调用基于 Java 的方法就足够了,这是否已经算作“回归 Java”?如果没有,有什么方法可以确保垃圾收集器有机会在我的用例中运行?

【问题讨论】:

    标签: java c++ garbage-collection java-native-interface


    【解决方案1】:

    使用 JNI 创建的 JVM 是一个完整的 JVM,包括 GC。

    这样想:你通常用来运行 Java 程序的 java 命令只不过是一个小的 JNI 程序,它创建一个 JVM,定位在命令行中命名的类,并进行静态调用到main(String[]) 方法。

    【讨论】:

      猜你喜欢
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 2019-11-12
      • 1970-01-01
      • 1970-01-01
      • 2017-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多