如何通过JNI调用Java方法让JVM垃圾收集参数?

问题描述 投票:1回答:1

我有一个本机应用程序启动JVM并通过JNI API调用一些方法。

粗略地说,本机应用程序:

  1. 启动JVM;
  2. 使用PushLocalFrame创建一个新框架;
  3. 构建一个Java对象x,通过JNI调用构造函数;
  4. PopLocalFrame(x)弹出框架;
  5. 在JVM中调用一个长时间运行的函数foo(x),将创建的对象作为参数传递给CallObjectMethod;
  6. 终止。

问题是在相同的情况下,步骤5与java.lang.OutOfMemoryError崩溃。这是意料之外的,因为通常Java函数在从仅JVM应用程序调用时不会占用太多内存。

使用VisualVM进行堆转储我发现有许多“GC根(Java框架)”,我没想到。我最好的解释是:

  1. foox采取一些领域并存储其中的东西;
  2. 在执行foo期间,JVM不能垃圾收集x,也不能传递存储在其中的任何内容。

那么,有没有办法通过JNI接口调用Java方法,让JVM垃圾收集参数?

Weak global references几乎是我想要的,但我不知道如何使用它们,因为理论上它们可以在创建之后立即进行垃圾收集,然后在函数调用中作为参数传递。

java garbage-collection jvm java-native-interface
1个回答
-1
投票

在处理本机资源时,您不应指望垃圾收集来释放内存。

相反,为包装本机对象或句柄的每个Java类实现Closable接口,并确保在解除引用之前关闭每个对象。

您可以使用try (<Allocate Closables Here>) { <Use Them Here> }语法来自动关闭对象。

© www.soinside.com 2019 - 2024. All rights reserved.