Утечка памяти в Java с использованием цвета AWT с альфа - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть особая проблема в простой системе частиц, которую я написал, и теперь она мучает меня.

//Code that does NOT cause memory leak
public void draw(Graphics g) {
    if (life > 0) {
        g.setColor(new Color(0, 0, 0,255));
        g.fillOval(x, y, 10, 10);
    }
}

//Code that does cause memory leak
public void draw(Graphics g) {
    if (life > 0) {
        g.setColor(new Color(0, 0, 0, 127));
        g.fillOval(x, y, 10, 10);
    }
}

Как указано выше, первый блок кода не вызывает утечку памяти, но когда яизмените значение альфа на менее чем 255, это приведет к тому, что использование оперативной памяти программ увеличится до 1,8 ГБ.Сначала я думал, что это из-за нового ключевого слова, но потом я понял, что это произойдет, только если я изменю альфа-значение на значение меньше 255. Любая помощь в том, как решить эту проблему, будет оценена, понимание еще более приветствуется.

по запросу я добавил базовый пример кода использования.

Main:

public class Main {
    public static void main(String[] args) {
        MyFrame frame = new MyFrame("test");
    }
}

JFrame:

public class MyFrame extends JFrame {

    MyPanel pane = new MyPanel();
    public MyFrame(String title)
    {
        setTitle(title);
        setSize(400,400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        add(pane);
        setVisible(true);
    }

}

И, наконец, JPanel:

public class MyPanel extends JPanel {
    java.util.Timer timer = new Timer();
    public MyPanel()
    {
        //create time to just repaint 60 times a second
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                repaint();
            }
        },16,16);
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.setColor(Color.BLACK);
        g.fillRect(0,0,500,500);
        //for loop to just redraw blocks to show leak
        for (int i = 0; i < 20;i++)
        {
            for (int c =0; c < 20;c++)
            {
                /*
                   create new color which causes leak, if you set the alpha
                   value to 255 it does not create the leak anymore
                */
                g.setColor(new Color(i * (255/ 20),0,c * (255/ 20),127)); 
                g.fillRect(i * 10,c * 10, 10,10);
            }
        }

    }
}
...