Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Xvfb内存无限增长,可生成SWT图像_Java_Linux_Memory_Swt_Xvfb - Fatal编程技术网

Java Xvfb内存无限增长,可生成SWT图像

Java Xvfb内存无限增长,可生成SWT图像,java,linux,memory,swt,xvfb,Java,Linux,Memory,Swt,Xvfb,我介绍一下这个场景: web服务(SpringMVC)通过带有参数的操作动态生成带有文本的图像,并将响应返回给客户端。 这项服务每分钟处理大约500张图像 图像是使用库SWT[1]生成的这在本地运行良好 为了测试或生产环境,应用程序安装在不带X的服务器上(CentOS/Ubuntu)。SWT能够绘制图像需要正确设置显示环境变量。因此,在服务器上安装Xvfb包以虚拟地模拟X环境 Xvfb: 1-screen 0 1x1x24-dpi 96 & DISPLAY = localhost: 1.

我介绍一下这个场景:

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

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

为了测试或生产环境,应用程序安装在不带X的服务器上(CentOS/Ubuntu)。SWT能够绘制图像需要正确设置显示环境变量。因此,在服务器上安装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]

更新:

添加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资源的释放。现在工作正常。

是否处理创建的图像实例?是否也处理
GC
Font
this.getDisplay()
会一直返回新的
Display
吗?如果对所有图像使用相同的
字体
,然后全局声明,则同样适用于
显示
。尝试运行以了解内存是如何泄漏的。请记住,在
SWT
中“您必须处理您创建的东西”
Blaz,我已经检查了代码,它没有发布Image的实例。Niranjan,我认为getDisplay()总是返回相同的显示,完整方法中的字体保存了实例变量,比如颜色(swt.Color)。我试着使用Sleak,但不仅打开了窗口,里面没有任何小部件,我想它必须在独立应用程序中正常工作,而不是在web上。另一方面,我用最少的(仅显示)测试应用程序,然后逐步添加文本、图像和颜色。在每一步中,我都使用JMeter运行一次,并监视内存。
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;
}