Java — правильное удаление изображения во избежание утечек памяти

Как следует из названия, у меня случаются утечки памяти, и я подозреваю, что их происхождение связано с созданием новых образов. Утечка памяти имеет тип java.util.Hashtable$Entry. Поиски в Google не дали мне ничего, что касалось бы создания изображений.

Проект представляет собой интерполятор - пользователь вводит несколько точек, а программа соединяет их кривыми. Когда это сделано, кривые рисуются на изображении. Это требует, чтобы каждый раз, когда генерируется интерполяция, изображение воссоздавалось с новой шириной и высотой, прежде чем оно будет нарисовано.

Я считаю, что я сузил утечку до этого метода:

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* представляют новую ширину и высоту изображения соответственно.

Я определил, что этот метод является основным источником, поскольку утечки заметны только при его вызове.

Как вы можете видеть выше, я попытался очистить изображение, а в другом разделе также удалил графику. К сожалению, это то, что мне удалось, и это не решило проблему утечки памяти.

Как мне избежать этой утечки памяти?


person MemoNick    schedule 10.02.2014    source источник
comment
Я бы дважды проверил, правильно ли вы распоряжаетесь графикой.   -  person Geoff Genz    schedule 10.02.2014
comment
Где используется HashMap? Какие типы объектов помещаются туда?   -  person CodeChimp    schedule 10.02.2014
comment
HashMap не принадлежит мне — я предполагаю, что он как-то связан с BufferedImage и используется изображением.   -  person MemoNick    schedule 10.02.2014
comment
@GeoffGenz перепроверил: reset(new_width, new_height); drawInterpolation(); graphics.dispose();   -  person MemoNick    schedule 10.02.2014
comment
Любой способ создать пример, в котором проблема может быть воспроизведена?   -  person Marco13    schedule 10.02.2014
comment
@ Marco13 Marco13 Думаю, это то, что мне нужно сделать. Я воздержался от этого раньше, так как это 77-страничный проект.   -  person MemoNick    schedule 10.02.2014


Ответы (1)


Я сам решил проблему. К сожалению, я не смог определить почему проблемы, но смог определить как ее решение.

В основном я сделал следующее:

  1. Создайте Graphics2D
  2. Сбросить изображение
  3. Утилизировать Graphics2D
  4. Создайте Graphics2D
  5. Нарисуйте интерполяцию
  6. Утилизировать Graphics2D

Несмотря на то, что некоторые утечки памяти все еще имеют место, они очень малы (незначительны), и я не думаю, что они имеют какое-либо отношение к этой проблеме.

person MemoNick    schedule 10.02.2014