java - 垃圾收集器是否在从 C++ 创建的 JVM 中运行?
问题描述
我有一个 C++ 代码库,其中我使用 JNI 创建一个 JVM,并偶尔与一个用 Java 实现的库进行交互。我很好奇,在这个用例中,Java 的垃圾收集器是否仍能可靠地运行和清理?
我在网上找到的大多数关于 JNI 的信息似乎都是关于“相反”的用例,人们通常似乎主要使用 Java 代码,有时通过 JNI 与本机代码交互。对于这样的用例,我在网上找到了以下内容:
在大多数情况下,不再在范围内的本地引用的自动垃圾收集可防止内存泄漏。当本机线程返回 Java(本机方法)或从 JVM 分离(调用 API)时,会发生这种自动垃圾收集。如果不发生自动垃圾回收,则可能发生本地引用内存泄漏。如果本机方法没有返回到 JVM,或者使用调用 API 的程序没有从 JVM 分离,则可能会发生内存泄漏。
我不确定在这种情况下“返回 Java”到底是什么意思。只是偶尔从 C++ 调用基于 Java 的方法就足够了,这是否已经算作“回归 Java”?如果没有,有什么方法可以确保垃圾收集器有机会在我的用例中运行?
解决方案
使用 JNI 创建的 JVM 是一个完整的 JVM,包括 GC。
可以这样想:java
您通常用于运行 Java 程序的命令只不过是一个小的 JNI 程序,它创建一个 JVM,定位在命令行上命名的类,并对main(String[])
方法进行静态调用。
推荐阅读
- python - 熊猫被意外的分隔符弄糊涂了
- elasticsearch - 如何调试 AWS Elasticsearch 中的高索引率但 Kibana 上的文档较少?
- javascript - 使用当前坐标数组移动标记,谷歌地图
- python - 如何更有效地将json响应数据插入雪花数据库?
- python - 根据逗号获取数组列中元素的计数并将计数转换为自己的列
- java - 当jar pom和tar pom都在同一个父pom下时,我们可以将调用的jar的名称更改为另一个tar吗?
- javascript - 在 X 轴上平移几次,然后在 Y 轴上平移会使 HTML 对象向后移动
- mysql - 为什么我在 Excel 中使用字符串作为参数的 MySQL 查询不起作用?
- java - 如何避免Springboot Camel Route每天因特定时间挂断信号而关闭
- azure-devops - 当并行阶段仍在运行时任务失败时,Azure Devops 是否可以发送邮件