如何解决由 ImageIO 插件引起的 OutOfMemoryError 错误?

2023-12-15

在工作中,我们有一些 Tomcat 服务器运行多个 Web 应用程序,其中大约一半必须执行一些图像处理。

在进行图像处理之前,这些网络应用程序会执行以下操作ImageIO.scanForPlugins()将适当的图像读取器和写入器放入内存中。虽然之前只是在需要处理图像的任何时候运行,但现在我们仅在 Web 应用程序初始化时运行扫描(因为我们在运行后不添加任何 jar,为什么要多次运行扫描?)

几天后,tomcat 实例因以下原因崩溃了:OutOfMemoryError。幸运的是我们有HeapDumpOnOutOfMemoryError选项集,所以我查看了堆转储。在转储中我发现 97% 的内存被 a 的实例占用javax.imageio.spi.PartialOrderIterator。大部分空间都被它的支持占据了java.util.LinkedList,其中有 1800 万个元素。链表由以下部分组成javax.imageio.spi.DigraphNode,其中包含加载的图像读取器和写入器ImageIO.scanForPlugins().

“啊哈”,我想,“我们必须在某个地方循环运行扫描,而我们只是一遍又一遍地添加相同的元素”。但是,我认为我应该仔细检查这个假设,所以我编写了以下测试类:

import javax.imageio.ImageIO;

public class ImageIOTesting {

public static void main(String[] args) {

    for (int i = 0; i < 100000; i++) {
        ImageIO.scanForPlugins();
        if (i % 1000 == 0) {
            System.out.println(Runtime.getRuntime().totalMemory() / 1024);
        }
    }
}
}

但是,当我在服务器环境上运行此类时,使用的内存量永远不会改变!

快速挖掘 javax.imageio 包的源代码表明,扫描会检查服务提供者是否已注册,如果是,则在注册新提供者之前取消旧提供者的注册。所以现在的问题是:为什么我有这个巨大的服务提供商链接列表?为什么它们存储为有向图?更重要的是,我该如何防止这种情况发生?


迟到回答一个老问题,但无论如何:

因为ImageIO插件注册表(IIORegistry) 是“VM 全局”,默认情况下它不能很好地与 servlet 上下文配合使用。如果您从以下位置加载插件,这一点尤其明显WEB-INF/lib or classes文件夹,正如OP似乎所做的那样。

Servlet 上下文动态加载和卸载类(每个上下文使用一个新的类加载器)。如果您重新启动应用程序,默认情况下旧类将永远保留在内存中(因为下一次scanForPlugins被称为,这是另一个ClassLoader扫描/加载类,因此它们将成为注册表中的新实例。在测试代​​码循环中,同样ClassLoader一直使用,因此实例被替换,真正的问题永远不会显现)。

要解决此资源泄漏问题,我建议使用ContextListener确保这些“上下文本地”插件被明确删除。这是一个例子IIOProviderContextListener我在几个项目中使用过,它实现了动态加载和卸载ImageIO插件。

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

如何解决由 ImageIO 插件引起的 OutOfMemoryError 错误? 的相关文章

  • Java Swing:从 JOptionPane 获取文本值

    我想创建一个用于 POS 系统的新窗口 用户输入的是客户拥有的金额 并且窗口必须显示兑换金额 我是新来的JOptionPane功能 我一直在使用JAVAFX并且它是不同的 这是我的代码 public static void main Str
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O

随机推荐

  • 如何在函数运行期间忽略所有用户输入?

    我有一个 Python 模块 它使用 pynput 侦听组合键 然后 一旦按下它 它就会在文本程序中键入一个字符串 效果很好 除了 在下面的示例中 用户的组合键设置为 shift space 这很有意义 并且可能是运行我的程序的 Windo
  • 我可以像 Joe Belfiore 一样在 Windows Phone 7 上使用“演示者模式”来进行应用程序演示吗?

    我希望能够在手机 电脑屏幕或投影仪上显示发生的情况 这似乎是可能的 因为微软在他们所有的演示中都做到了这一点 但我似乎不知道如何做到 例如 我构建了一个应用程序 我想向一屋子的潜在客户演示它 在演示过程中我不能很好地使用模拟器 我希望房间里
  • 从 PHP 插入时在 MongoDB 上执行 JS

    使用 mongo shell 时 我可以运行如下命令 db sandbox insert line db eval storedFunction or db sandbox insert line function return 1337
  • 如何使用 render(:update) 和 Replace_html 重新加载 div?

    如何仅重新加载页面上的 div id 我只需要重新加载某个div 在我的控制器中我有 def mycontrolleraction render update do page reload only the div adiv control
  • C++中删除指针

    背景 我正在努力理解指针 几周前我们在学校才看到它们 今天练习时我遇到了一个愚蠢的 问题 这对你来说可能非常简单 但我几乎没有编程经验 我在 SO 中看到了很多关于删除指针的问题 但它们似乎都与删除类而不是 简单 指针 或任何正确的术语 有
  • JavaScript - 通过 JavaScript 访问网络选项卡 [重复]

    这个问题在这里已经有答案了 我需要访问 例如 Chrome 开发者工具网络选项卡JavaScript 我只需要 1 源名称 第 1 列 和2 类型 第 3 列 但我完全不知道该怎么做 非常感谢链接 提前致谢 我做了一些研究 但似乎你做不到
  • 列表视图中的居中文本

    我发现不可能将文本在列表视图中居中 尝试在几乎所有内容上尝试wrapp content和layout gravity center 但文本不会移动 这是我的班级代理Eco package com blabla import java tex
  • 如何通过void指针访问成员

    首先尝试编写一个小程序将基本算术翻译成英语 最后我构建了一个二叉树 这不可避免地非常不平衡 来表示求值的顺序 首先 我写了 struct expr typedef struct unsigned char entity flag posit
  • 通过ObjectOutputStream发送文件然后用Java保存它?

    我有这个简单的服务器 客户端应用程序 我试图让服务器通过 OutputStream FileOutputStream OutputStream ObjectOutputStream 等 发送文件 并在将其保存到实际文件之前在客户端接收它 问
  • 'this' 绑定到订阅函数而不是 Angular2 中的外部组件范围

    我在 Angular2 中的一个组件中遇到了问题 因为 this 在我的组件之一中绑定到了错误的上下文 我有其他组件没有发生此问题 但我看不出有什么区别 这是我的代码 成分 import Component Input from angul
  • python闭包中的cell_contents

    python 中的 cell contents 对闭包的调用是否发生了变化 我知道 func closure 不起作用并且 closure works func closure cell contents Traceback most re
  • 带有逻辑或的 IF 语句[重复]

    这个问题在这里已经有答案了 if 1 2 4 cout lt lt True else cout lt lt False 我就是这样读到上面的内容的 如果 1 等于 2 或 4 则打印 true 否则 打印 false 当执行此操作时 tr
  • Hadoop 2.4 无法执行目标 org.apache.maven.plugins:maven-antrun-plugin:1.7

    我正在尝试从源代码安装 Hadoop 2 4 0 出现以下错误 我用 google 搜索但找不到任何解决方案 请帮忙 Regards 操作系统 Ubuntu 12 04 64 位 Java java版本 1 6 0 45 协议 版本 lib
  • Django ORM - 具有不同选择子句的分组聚合

    假设我们有 Django ORM 模型Meetup具有以下定义 class Meetup models Model language models CharField speaker models CharField date models
  • 如何在 MISRAC:2012 中创建遵循 Dir 4.12 和 4.8 的模块?

    此问题涉及遵循 MISRAC 2012 指南的 ISO C99 编码 我正在寻找有关 Dir 4 8 如果指向结构或联合的指针在翻译单元内从未取消引用 则应隐藏对象的实现 以及 Dir 4 12 不应使用动态内存分配 的指导 在 C 中实现
  • 如何使用 ImageMagick 将 SVG 转换为 PNG?

    我有一个定义大小为 16x16 的 SVG 文件 当我使用 ImageMagick 的转换程序将其转换为 PNG 时 我得到一个 16x16 像素的 PNG 它太小了 convert test svg test png 我需要指定输出 PN
  • 如何使自定义状态discord.py

    为什么我的代码不起作用 bot event async def on ready print Bot is now working await bot change presence activity discord CustomActiv
  • 数据库字段中的枚举存储

    最好存储枚举value或枚举name在数据库表字段中 例如 我应该将 TJLeft 存储为字符串还是数据库中的等效值 Public Enum TextJustification TJLeft TJCenter TJRight End Enu
  • 为什么更新“浅”复制字典不会更新“原始”字典? [复制]

    这个问题在这里已经有答案了 在阅读文档时dict copy 它说它制作了字典的浅表副本 我正在关注的书 Beazley s Python Reference 也是如此 书中写道 m copy 方法使浅 a 中包含的项目的副本 映射对象并将它
  • 如何解决由 ImageIO 插件引起的 OutOfMemoryError 错误?

    在工作中 我们有一些 Tomcat 服务器运行多个 Web 应用程序 其中大约一半必须执行一些图像处理 在进行图像处理之前 这些网络应用程序会执行以下操作ImageIO scanForPlugins 将适当的图像读取器和写入器放入内存中 虽