Tomcat 服务器在调整大量图像大小时崩溃

Tomcat server crashed while resizing a number of images

我设法关闭了 运行 我的网络应用程序的服务器。这是一个 Tomcat 7 运行 具有相当不错规格的 JVM。我的一个控制器用于生成调整大小的图像版本。我访问了一个页面,该页面要求此控制器提供一些调整大小的图像。服务器死得很惨,catalina.out 日志中只有这一行。其他任何地方都没有任何痕迹(我能找到)。我很困惑。这是怎么回事?此行没有 google 个搜索结果。

java: cmsio0.c:1293: cmsSaveProfileToIOhandler: Assertion `(hProfile != ((void *)0))' failed.

根据要求调整大小的相关代码在这里:

try {
    response.setContentType("image/jpeg");
    LOG.debug("Resizing image to thumbnail dimensions");
    long start = System.currentTimeMillis();
    Thumbnails.of(imageInputStream).size(maxSide, maxSide).outputQuality(0.5).outputFormat(JPG).toOutputStream(response.getOutputStream());
    LOG.debug("Completed in {} ms", System.currentTimeMillis() - start);
} finally {
    IOUtils.closeQuietly(imageInputStream);
}

我不能 100% 确定,但这听起来与我们在生产服务器上遇到的问题非常相似。

基本上发生了 OOM 错误,但问题是 JVM 试图进行的堆分配失败了(在我们的例子中是因为我们将 XMX 设置为大于物理内存而没有创建任何交换space).由于 *nix 处理这种情况的方式,它似乎可以随机终止进程。系统中的其他地方通常会有一个日志,告诉您它杀死了一个进程以释放内存。我们的解决方法是将 XMX 设置为小于物理内存,因为核心问题不是我们使用了太多实际内存,而是 JVM 试图分配太多未由物理内存备份的内存,即使它不是严格需要的。您的图片大小调整听起来很相似。