【发布时间】:2017-09-16 03:30:10
【问题描述】:
我有一个游戏,它使用 ArrayList 来跟踪屏幕上的障碍物(从顶部向下流动)。一旦它们到达底部,它们就会被移除。我有一个主课和一个障碍课。 Obstacle 包含一个方法,该方法将我的一个图像文件作为 BufferedImage 返回。图片文件不超过10K,有的小于1K。我知道我可以使用 -Xmx 来增加最大堆空间,但我认为这不是问题,因为文件非常小。我的想法是为图像保留堆空间,但是一旦不再使用,该空间仍然保留。我用谷歌搜索了一下,发现 Java 有一个“垃圾收集器”,一旦图像不再使用,它应该释放堆空间备份。除了使用太大的文件外,还有一种叫做“内存泄漏”的东西。这是一个非常简单的程序,我读到内存泄漏发生得很慢,但我通常在一分钟内得到Java OutOfMemory Error: heap space。
在主类的while循环里面:
JLabel freshObsLabel = null;
for (int i = 0; i < obsList.size(); i++) //looping through list of obstacles
{
freshObsLabel = new JLabel(new ImageIcon(obsList.get(i).getObsImg())); //error occurs on call to getObsImg()
frame.getContentPane().add(freshObsLabel);
障碍类中的getObsImg()方法:
String obsImgDirectory;
BufferedImage obstacleImg;
public BufferedImage getObsImg() //gets BufferedImage corresponding to keyword given in constructor
{
obsImgDirectory = obstacleType + "Obs.jpg";
try {
obstacleImg = ImageIO.read(new File(obsImgDirectory)); //line on which the error occurs
} catch (IOException e) {
System.out.println("'" + obsImgDirectory + "' could not be read or '" + obstacleType + "' is an invalid obstacle type.");
e.getStackTrace();}
return obstacleImg;
}
谢谢,我希望这个问题能得到很好的接受,否则我可能会被阻止。我对 java 很陌生,所以我想请你放轻松。
【问题讨论】:
-
我可以看到您将标签+图像添加到内容窗格。但是你会删除它们吗?另外,您迭代的障碍列表有多大?
-
我一共使用了3张图片,但是障碍很多。障碍物列表开始时为空,但每 3 秒添加一个新障碍物。障碍物每 0.75 秒向下移动 1 个像素,当它们到达底部(1500 像素外)时,它们会从列表中删除。列表中堆积的障碍并不多,而且没有一个使用非常大的文件,所以我认为不会使用所有的堆空间。
标签: java memory-leaks bluej