0

我介绍一下场景:

Web 服务 (SpringMVC) 通过带有参数的操作动态生成带有文本的图像并将响应返回给客户端。该服务每分钟处理大约 500 张图像。

这些图像是使用库SWT [1] 生成的。这在本地运行良好

为了测试或生产环境,应用程序安装在没有 X (CentOS / Ubuntu) 的服务器上。而 SWT 可以绘制图像需要正确设置 DISPLAY 环境变量。因此,在服务器上安装Xvfb包以虚拟模拟 X 环境。

Xvfb: 1-screen 0 1x1x24-dpi 96 &
DISPLAY = localhost: 1.0
export DISPLAY
$TOMCAT/bin/startup.sh

这在前几分钟工作正常,但最终 Xvfb 进程占用的内存无限增长(从 1 mb 到 1.3 Gb 并且还在增长......)。

我尝试了不同的配置和参数 Xvfb [3],但没有成功。

Xvfb: 1-screen 0 1x1x24 -dpi 96 -noreset &
Xvfb: 1-screen 0 1x1x24 -dpi 96 -reset &
Xvfb: 1-screen 0 1x1x24 -dpi 96 -ld 262144 -ls 262144 -lf 1024 &

这个问题花了好几天没有解决?我可以指导您更多尝试或在哪里更新?

[1]

public BufferedImage drawImage () {
    // example code, real code is more complex
    FontData [] FontData fontData = new [] {new FontData ("Arial", 8, SWT.NORMAL)};
    Display display = this.getDisplay ();
    Image image = new Image (display, IMAGE_WIDTH, IMAGE_HEIGHT);
    GC gc = new GC (image);
    gc.setAntialias (SWT.ON);
    gc.setInterpolation (SWT.HIGH);
    gc.setBackground (display.getSystemColor (SWT.COLOR_WHITE));
    gc.fillRectangle (0, 0, this.image.getBounds (). width, this.image.getBounds (). height);
    gc.setFont (new Font (display, fontData [0]));
    gc.setForeground (display.getSystemColor (SWT.COLOR_RED));
    gc.drawText ("Text to draw in image", 5, 6);

    BufferedImage bi = null;
    bi = this.convertToAWT (hi.getImage (). getImageData ());
    return bi;
}

@RequestMapping
public void RetrieveImage (HttpServletRequest request, HttpServletResponse response) throws IOException {
    response.setContentType ("image / png");
    BufferedImage image = drawImage ();
    ByteArrayOutputStream os = new ByteArrayOutputStream ();
    ImageIO.write (bi, "png", os);
    InputStream is = new ByteArrayInputStream (os.toByteArray ());
    IOUtils.copy (is, response.getOutputStream ());
}

更新:

添加 getDisplay 方法。

private Display getDisplay() throws DrawImageException {

    if (display == null || display.isDisposed()) {
        LOGGER.debug("Initializing display...");
        try {
            display = Display.getDefault();
        } catch (Exception e) {
            throw new DrawImageException("Can't get default display", e);
        }
    }
    return display;
}

解决了

正如 Baz 和 Niranjan 所说,问题在于 SWT 资源的释放。现在工作正常。

4

0 回答 0