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

时间:2015-03-10 00:02:02

标签: java tomcat

我设法关闭运行我的网络应用的服务器。它是运行JVM的Tomcat 7,具有相当不错的规格。我的一个控制器用于生成调整大小的图像版本。我访问了一个页面,询问该控制器是否有大量已调整大小的图像。在catalina.out日志中只有这一行,服务器死了可怕的死亡。其他地方没有任何痕迹(我能找到)。我很困惑。这是怎么回事?此行没有谷歌搜索结果。

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);
}

1 个答案:

答案 0 :(得分:2)

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

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