垃圾收集和 JNI 调用

2024-04-13

我遇到 JNI 程序随机内存不足的问题。

这是一个 32 位 java 程序,它读取文件,进行一些图像处理,通常使用 250MB 到 1GB。然后,所有这些对象都会被丢弃,然后程序对 JNI 程序进行一系列调用,通常需要 100-250MB。

当交互运行时,我从未见过问题。但是,当运行对许多文件连续执行此操作的批处理操作时,JNI 程序将随机耗尽内存。它可能在一两个文件上出现内存问题,然后在接下来的 10 个文件上运行良好,然后再次出现故障。

我在 JNI 调用之前转储了可用内存量,它遍布整个地图,有时 100MB,有时 800MB。我的解释是,Java 垃圾收集有时会在图像处理后立即运行,有时则不会。如果不是,则可能没有足够的内存用于 JNI 程序。

我已经阅读了所有关于 GC 是非确定性的、不应该调用它、不会产生任何区别等的内容,但看起来在开始 JNI 调用之前强制 GC 确实会改善这种情况。

但有没有办法真正确保有一定量的空闲内存才能继续呢?

要回答有关JNI程序的问题,该程序是由另一家公司提供的,我对它如何分配内存没有真正的了解。我所知道的是它是用c++编写的,它没有垃圾收集。我被告知它需要 100-250MB 的内存,我看到的数字也证实了这一点。

也许我应该将问题改写为:如果我要进行一个我知道需要 250MB 内存的 JNI 调用,我如何确保它有那么多可用内存?

确实,一种可能的解决方案是进行 64 位构建。然而,这个批处理操作是 32 位构建上的 QA 的一部分,所以我想测试真实的东西。


我自己解决这个问题的方法就是简单地调用System.gc(),但是从inside本机代码:

#include <jni.h>
// ...
int my_native_function(JNIEnv* env, jobject obj) {
    jclass    systemClass    = nullptr;
    jmethodID systemGCMethod = nullptr;
    // ...
    // Take out the trash.
    systemClass    = env->FindClass("java/lang/System");
    systemGCMethod = env->GetStaticMethodID(systemClass, "gc", "()V");
    env->CallStaticVoidMethod(systemClass, systemGCMethod);
}

我希望这对你也有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

垃圾收集和 JNI 调用 的相关文章

随机推荐

  • 假设没有非时间指令,“xchg”是否包含“mfence”?

    我已经看过了这个答案 https stackoverflow com a 50279772 391161 and 这个答案 https stackoverflow com a 19099164 391161 但似乎都没有清楚明确地说明等价或
  • Intellij IDEA:未命中断点,并显示为灰色

    在 Mac OS X 上运行 JDK 1 7 时 我的项目上的断点突然不起作用 并且显示为灰色 他们今天早些时候在工作 所以不确定我做了什么导致了这种情况 我正在使用 Intellij 13 1 3 为什么断点会像这样停止工作 天哪 我刚刚
  • php数组计数与动态结果

    我正在尝试计算从脚本返回的数组的结果 有两种情况我可以找回选项a是 Array Id gt 1779 SupplierId gt 1809 SupplierName gt cccccc 和第二个选项 ib Array 0 gt Array
  • 在delphi中禁用窗体大小调整

    有什么方法可以阻止用户调整表单大小吗 目前我正在使用 当表单大小改变时 MainForm Height 761 MainForm Width 777 但这看起来很可怕 因为当用户尝试更改表单大小时它会闪烁 固定尺寸很简单 你有两个选择 De
  • Cassandra Nodetool URISyntaxException:“索引 7 处的 IPv6 地址格式错误”

    Cassandra nodetool 更新 OpenJDK 后抛出错误 nodetool status nodetool Failed to connect to 127 0 0 1 7199 URISyntaxException Malf
  • 什么是托管代码和非托管代码? [复制]

    这个问题在这里已经有答案了 我发现有人说托管代码和非托管代码 有什么不同 它仅适用于 Net吗 你可以阅读这篇维基百科文章 托管代码 http en wikipedia org wiki Managed code 基本上托管代码是一个微软术
  • Box2D - b2body GetUserData 始终返回 null

    我正在尝试根据 box2d 中的 b2body 调整精灵的位置和旋转 创建主体后 我将 userData 属性设置为保存精灵和位置等的主体对象的属性 问题是在勾选方法 b gt GetUserData 中永远不会检索我放入其中的对象 你能看
  • GPS 对比加速度计计算距离

    我正在尝试实现一个健身应用程序 可以在Android 中跟踪跑步速度和跑步距离 看起来我可以使用 GPS 或加速度计来计算这些信息 由于跑步者可能会将手机放在手里 放在肩膀上或放在口袋里 所以我的第一直觉是使用 GPS 获取位置并计算跑步速
  • 如何将 SSH 密钥与 Jenkins 工作流插件结合使用

    有一个由以下执行的常规脚本Jenkins 工作流插件 https github com jenkinsci workflow plugin As 有记录的 https github com jenkinsci workflow plugin
  • 如何让 SWIG 在 C# 中处理 utf8 字符串?

    我正在编写一个可移植的 C 库 它与其他语言 java C python 绑定 我在以下人员的帮助下进行这些绑定SWIG http www swig org 我有一个用 C 编写的类 class MyClass public const c
  • 我可以对字段和构造函数参数使用相同的名称吗?

    class C T a public C T a a a 合法吗 是的 它是合法的并且适用于所有平台 它将正确地将您的成员变量 a 初始化为传入的值 a 一些更干净的人认为以不同的方式命名它们 但并非全部 我个人实际上经常使用它 具有相同变
  • 如何获取 NSString 的宽度?

    我正在尝试获取 NSString 的宽度 例如 NSString myString hello 有没有办法做到这一点 Thanks 这是一个相对简单的方法 只需创建一个具有适当字体的 NSAttributedString 并询问其大小 CG
  • Android 自定义组件中的布局未膨胀

    我在自定义视图中遇到空指针异常 源自LinearLayout 因为它找不到它的子视图 这是代码 public class MyView extends LinearLayout public MyView Context context A
  • DrawingContext.DrawLine:笔没有完全不透明度?

    当我画这样的东西时 这里只是随机画 public partial class MainWindow Window public MainWindow InitializeComponent DrawingVisual visual new
  • 专业密钥的许可证检查

    因此 我想制作一个加载了完整功能的免费应用程序 在应用程序检测到许可的专业版密钥之前 专业版功能将被禁用 当然 我想让专业密钥使用 LVL 检查其许可证 虽然到目前为止我知道如何正确做事 但我不知道如何使专业版密钥与应用程序进行通信以启用专
  • 当在封闭类模板中引用特化时,成员类模板的隐式实例化

    include
  • fetch-api 中的“最大重定向”错误意味着什么?

    我试图从网站获取一些数据 但收到以下错误 FetchError maximum redirect reached at
  • 在 Bash 中的函数内部使用声明

    我想使用函数更改全局变量 或至少附加到它 input Hello example input func declare x example input World func echo input 其输出将是 Hello 的原始值 如果该函数
  • 重新排序时无法将 UITableViewCell 从当前位置拖动

    我试图让我的核心数据支持的 UITableView 具有重新排序的能力 在实现所有这些委托和提到的核心数据的一些技术之后here https stackoverflow com q 1077568 147564我发现奇怪的行为 点击编辑按钮
  • 垃圾收集和 JNI 调用

    我遇到 JNI 程序随机内存不足的问题 这是一个 32 位 java 程序 它读取文件 进行一些图像处理 通常使用 250MB 到 1GB 然后 所有这些对象都会被丢弃 然后程序对 JNI 程序进行一系列调用 通常需要 100 250MB