JAI create 似乎使文件描述符保持打开状态

2024-01-07

我有一些旧代码直到最近才工作,但现在似乎很糟糕,因为它在使用 OpenJDK 6 而不是 Java SE 6 的新服务器上运行。

问题似乎围绕着 JAI.create。我有 jpeg 文件,我将其缩放并转换为 png 文件。这段代码过去工作时没有泄漏,但现在已经转移到运行 OpenJDK 的机器上,文件描述符似乎永远不会关闭,并且我看到越来越多的 tmp 文件累积在服务器上的 tmp 目录中。这些不是我创建的文件,所以我假设是 JAI 执行的。

另一个原因可能是新服务器上的堆大小较大。如果 JAI 在 Finalize 时进行清理,但 GC 发生的频率较低,那么可能会因此而导致文件堆积。减少堆大小不是一个选择,而且我们似乎遇到了与增加 ulimit 无关的问题。

这是我运行此命令时泄漏的文件的示例:

/tmp/imageio7201901174018490724.tmp

一些代码:

// Processor is an internal class that aggregates operations
// performed on the image, like resizing
private byte[] processImage(Processor processor, InputStream stream) {
    byte[] bytes = null;
    SeekableStream s = null;
    try {
        // Read the file from the stream
        s = SeekableStream.wrapInputStream(stream, true);
        RenderedImage image = JAI.create("stream", s);
        BufferedImage img = PlanarImage.wrapRenderedImage(image).getAsBufferedImage();
        // Process image
        if (processor != null) {
            image = processor.process(img);
        }
        // Convert to bytes
        bytes = convertToPngBytes(image);
    } catch (Exception e){
       // error handling
    } finally  {
        // Clean up streams
        IOUtils.closeQuietly(stream);
        IOUtils.closeQuietly(s);
    }
    return bytes;
}

private static byte[] convertToPngBytes(RenderedImage image) throws IOException {
    ByteArrayOutputStream out = null;
    byte[] bytes = null;
    try {
        out = new ByteArrayOutputStream();
        ImageIO.write(image, "png", out);
        bytes = out.toByteArray();
    } finally {
        IOUtils.closeQuietly(out);
    }
    return bytes;
}

我的问题是:

  1. 有人遇到过这个问题并解决了吗?由于创建的 tmp 文件不是我的,我不知道它们的名字是什么,因此无法对它们做任何事情。
  2. 用于调整图像大小和重新格式化图像的库有哪些?我听说过 Scalr - 还有什么我应该研究的吗?

我宁愿此时不重写旧代码,但如果没有其他选择......

Thanks!


只是对临时文件/终结器问题的评论,现在您似乎已经解决了问题的根源(评论太长,所以我将其作为答案发布...:-P):

临时文件是由 ImageIO 创建的FileCacheImageInputStream。每当您调用时都会创建这些实例ImageIO.createImageInputStream(stream)useCache http://docs.oracle.com/javase/6/docs/api/javax/imageio/ImageIO.html#getUseCache%28%29标志是true(默认)。您可以将其设置为false禁用磁盘缓存,但以内存缓存为代价。当您有一个很大的堆时,这可能有意义,但如果您正在处理非常大的图像,则可能没有意义。

我还认为您对终结器问题的看法(几乎)是正确的。您会发现以下“finalize”方法FileCacheImageInputStream(Sun JDK 6/1.6.0_26):

protected void finalize() throws Throwable {
    // Empty finalizer: for performance reasons we instead use the
    // Disposer mechanism for ensuring that the underlying
    // RandomAccessFile is closed/deleted prior to garbage collection
}

类的构造函数中有一些非常“有趣”的代码,它们在实例完成时设​​置自动流关闭和处置(如果客户端代码忘记这样做)。这在 OpenJDK 实现中可能有所不同,至少看起来有点 hacky。目前我也不清楚我们正在谈论的“性能原因”到底是什么......

无论如何,它似乎在呼唤close on the ImageInputStream实例,就像您现在所做的那样,将正确关闭文件描述符并删除临时文件。

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

JAI create 似乎使文件描述符保持打开状态 的相关文章

随机推荐

  • Microsoft 是否有关于不同 Windows 平台上应用程序数据与用户数据存储的最佳实践文档?

    创建面向多个 Windows 版本的应用程序时 确定应用程序特定数据应存储在何处的最佳实践是什么 具体来说 应用程序特定数据 例如应用程序配置数据 用户特定数据 设置 例如 我知道在 Windows Vista 上有可以使用的环境变量 例如
  • return 语句中的 C++ constexpr 函数

    为什么 constexpr 函数不在编译时计算 而是在运行时在 main 函数的 return 语句中计算 它尝试过 template
  • 在带有 ES 模块的 Node.js 中使用相对路径导入

    过去我用过app module path每当我想在 Node js 应用程序中使用相对路径时 如果我通过以下方式使用 ES 模块 mjs格式 如何在某个目录路径变得相对的情况下具有相同的功能 以另一种方式 我是否能够为目录分配一个别名 以便
  • 如何在solr中搜索多个方面?

    我需要在 solr 中搜索方面 如下所示 fq 国家 美国 fq 国家 加拿大 fq 主题 工业 fq 主题 政治 现在我需要搜索具有上述方面 逻辑与 和 逻辑或 的文章 假设我有以下文章 国家 美国法国 主题 英思科 国家 美国加拿大 主
  • Java 奇怪的程序输出中的移位运算符

    我遇到了以下程序 它的行为方式出乎意料 public class ShiftProgram public static void main String args int i 0 while 1 lt lt i 0 i System out
  • 尽管进程已终止,为什么 os.kill(pid, 0) 返回 None ?

    这个问题涉及到这个答案 https stackoverflow com a 13402639 1125413我的其他问题之一 在这个答案中我被告知可以使用os kill pid 0 检查子进程是否已终止 如果它还在运行 None被返回 如果
  • C# 文件关联的正确方法

    我一直在寻找一种正确的方法来使文件关联在 WinXP 及更高版本上工作 如果该关联已存在 则应将其替换 我开发的应用程序始终在管理模式下运行 因此权限应该不成问题 我遇到过一些旧帖子 其中有一些示例代码 但其中一些工作得不够好 有些则根本不
  • 更新到 macOS 13.3 无法编译 cpp

    更新到 Ventura 13 3 安装最新的 Xcode 和命令行工具后 我在编译任何 cpp 文件时收到此错误 Applications Xcode app Contents Developer Platforms MacOSX plat
  • 为什么默认参数不能依赖于非默认参数? [复制]

    这个问题在这里已经有答案了 考虑以下构造函数 class MyClass MyClass unsigned int dimension std vector vector unitaryVector dimension where unit
  • 如何根据日历模式创建事件?

    我正在尝试为某人创建一个 轮班 日历 我知道该模式从哪一天开始 并且我知道该模式的断断续续的日期 但我在将其翻译成代码时遇到了麻烦 他们工作4天 休息3天 工作4天 休息3天 工作4天 休息2天 如此循环 我需要创建一些逻辑来基于此为日历创
  • Material SearchView 实现错误

    我正在开发一个 Android 应用程序 现在一切都很好 但是当尝试使用 Google 指南实现 Material SearchView 并逐步遵循一些教程时 我无法弄清楚这个错误 菜单 main xml menu menu
  • 在 git repo 上工作,无需 cd 进入目录

    当我还没有在存储库上运行 git 命令时 我将如何运行cd进入那个目录 IE 我想跑git branch repos myrepo git 从 git 1 8 5 开始 使用 C option git C Users michael Dev
  • 如何在 C++ 中使用 XCode 4.2 设置 OpenGL 项目?

    我正在尝试使用 C 来了解一些图形 我认为最好从功能最强大的图形框架开始 因此我将使用 Lion 中包含的 OpenGL 基本上我在 XCode 4 2 中启动了一个 C 命令行工具 这就是我所做的一切 我需要以某种方式将 OpenGL 与
  • 为什么施特拉森矩阵乘法比标准矩阵乘法慢得多?

    I have written programs in C Python and Java for matrix multiplication and tested their speed for multiplying two 2000 x
  • 如何转换 Shapefile 的坐标?

    我正在尝试将邻居数据放入我的应用程序中 但我使用的数据存在问题 这些数据是我从here http gispub02 sfgov org website sfshare catalog realtor neighborhoods zip 该文
  • 如何在 Swift 中重写 setter

    超类 class MySuperView UIView var aProperty 子类继承超类 class Subclass MySuperClass I want to override the aProperty s setter g
  • Fluent-bit 可以解析一个文件中的多种类型的日志行吗?

    我在 k8s 中有一个相当简单的 Apache 部署 使用 Fluent bit v1 5 作为日志转发器 我的设置与下面存储库中的设置几乎相同 我正在运行 AWS EKS 并将日志输出到 AWS ElasticSearch Service
  • 更新新版本应用程序时删除sqlite数据库

    我已经上传了一个 apk 版本 1 0 其中有 22 个表SQLite数据库在 Google Play 商店上 现在我想在新版本 2 0 版 应用程序中更新包含 36 个表的数据库 我正在存储datebase在默认位置 所以当我按时 清除
  • Lua 中的 ISO 8601 时间戳

    如何将时间戳转换为 ISO 8601 格式 例如2009 01 28T21 49 59 000Z 在 Lua 中 我专门尝试使用HttpLua模块 http wiki nginx org HttpLuaModule在 Nginx 中 Try
  • JAI create 似乎使文件描述符保持打开状态

    我有一些旧代码直到最近才工作 但现在似乎很糟糕 因为它在使用 OpenJDK 6 而不是 Java SE 6 的新服务器上运行 问题似乎围绕着 JAI create 我有 jpeg 文件 我将其缩放并转换为 png 文件 这段代码过去工作时