Java - paintComponent内存泄漏

时间:2016-12-26 15:32:43

标签: java swing graphics jpanel paintcomponent

我现在正在使用Swing在一个Java GUI项目(一个小的Dungeon Crawler)中工作,我的paintComponent方法中似乎存在内存泄漏,但我无法弄清楚是什么导致它:

class GamePanel extends JPanel {

    private BufferedImage floor;
    private BufferedImage wall;
    private BufferedImage nullTile;
    private TileMap tileMap;

    private int centerImageX;
    private int centerImageY;

    public GamePanel(TileMap t) {
        //setTitle("Dungeon Crawler v0.1a");
        tileMap=t;
        setSize(800,600);

        centerImageY=(this.getHeight()/2)-16;
        centerImageX=(this.getWidth()/2)-16;

        setVisible(true);

        try {
            floor = ImageIO.read(new File(TileType.Floor.toString()+".png"));
            wall = ImageIO.read(new File(TileType.Wall.toString()+".png"));
            BufferedImage nullTileIn = ImageIO.read(new File(TileType.Null.toString()+".png"));
            nullTile = new BufferedImage(nullTileIn.getWidth(),nullTileIn.getHeight(),BufferedImage.TYPE_INT_ARGB);
            Graphics2D g = nullTile.createGraphics();
            g.drawImage(nullTileIn,0,0,null);
            g.dispose();
        } catch (IOException e) {
            System.out.println("Shit hit the fan");
        }



    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);


        for (int i=0;i<50;i++) {
            for (int j=0;j<50;j++) {                
                    g.drawImage(typeToImage(tileMap.getTile(i, j).type), i*32, j*32, null);
            }
        }

        g.dispose();
    }

    private BufferedImage typeToImage(TileType t) {
        switch (t) {
            case Null:
                return nullTile;
            case Floor:
                return floor;
            case Wall:
                return wall;

        }
        return nullTile;
    }
}

tileMapTile个对象的二维数组,但这些不会发生变化,所以它们不是罪魁祸首,typeToImage包含一个简单的switch-case ,它将TileType枚举中的值连接到我们在构造函数中创建的BufferedImage个对象之一。

班上没有别的东西可以导致内存泄漏,但也许你可以帮我找到源码。

1 个答案:

答案 0 :(得分:0)

我认为BufferedImage会导致内存泄漏。我也有类似的情况。在一个长期运行的线程中,我正在绘制一个组件。我每次调用函数时都会创建一个新的BufferedImage但是在完成绘图之后,BufferedImage占用的内存不会被垃圾收集。只要应用程序运行,内存使用量就会增加。

从技术上讲,这不是内存泄漏。 GC不会立即清除BufferedImage占用的内存。它在必要时清除内存(取决于您的堆,堆栈,permspace等分配)。您可以通过调整-Xmx参数(是否有OutOfMemoryError)进行测试。