Java - 正确删除映像以避免内存泄漏

时间:2014-02-10 13:52:21

标签: java memory-leaks bufferedimage

正如标题所示,我得到了内存泄漏,我怀疑它们的起源在于新图像的创建。内存泄漏的类型为 java.util.Hashtable $ Entry 。谷歌搜索没有向我提供与图像创建有关的任何内容。

项目是插补器 - 用户输入多个点,程序将它们与曲线连接在一起。完成此操作后,曲线将在图像上绘制。这就需要每次生成插值时,在绘制图像之前,使用新的宽度和高度重新创建图像。

我相信我已经缩小了对这种方法的泄漏:

public void reset(int width, int height){
    if (width >= 15){
        i_width = width;
    } else {
        i_width = 15;
    }
    if (height >= 15){
        i_height = height;
    } else { 
        i_height = 15;
    }

    try {
        image.flush();
    } catch (Exception e) {}

    image = new BufferedImage(i_width, i_height, BufferedImage.TYPE_INT_ARGB);

    graphics = image.createGraphics();
    Color color = new Color(1f, 0f, 1f, 0f);
    graphics.setColor(color);
    for(int y = 0; y < i_height; y++){
        for(int x = 0; x < i_width; x++){
            graphics.fillRect((x), (y), 1, 1);
        }
    }
}

上面, image 是我写的BufferedImage,而 graphics 是Graphics2D实例。你可能猜到,* i_width *和* i_height *分别代表图像的新宽度和高度。

我确定这个方法是主要的来源,因为泄漏只有在被调用时才会被注意到。

正如您在上面所看到的,我已经尝试刷新图像,而在另一部分我也处理了图形。不幸的是,就我而言,这并没有解决内存泄漏问题。

我应该如何避免此内存泄漏?

1 个答案:

答案 0 :(得分:0)

我自己解决了这个问题。不幸的是,我无法确定问题的为什么,但我可以确定解决方案的如何

基本上我做的是以下内容:

  1. 创建Graphics2D
  2. 重置图片
  3. 处理Graphics2D
  4. 创建Graphics2D
  5. 绘制插值
  6. 处理Graphics2D
  7. 虽然仍有一些内存泄漏,但它们非常小(无关紧要),我不相信它们与此问题有任何关系。