我现在正在使用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;
}
}
tileMap
是Tile
个对象的二维数组,但这些不会发生变化,所以它们不是罪魁祸首,typeToImage
包含一个简单的switch-case
,它将TileType
枚举中的值连接到我们在构造函数中创建的BufferedImage
个对象之一。
班上没有别的东西可以导致内存泄漏,但也许你可以帮我找到源码。
答案 0 :(得分:0)
我认为BufferedImage
会导致内存泄漏。我也有类似的情况。在一个长期运行的线程中,我正在绘制一个组件。我每次调用函数时都会创建一个新的BufferedImage
但是在完成绘图之后,BufferedImage
占用的内存不会被垃圾收集。只要应用程序运行,内存使用量就会增加。
从技术上讲,这不是内存泄漏。 GC不会立即清除BufferedImage
占用的内存。它在必要时清除内存(取决于您的堆,堆栈,permspace等分配)。您可以通过调整-Xmx参数(是否有OutOfMemoryError
)进行测试。