Java 2D游戏内存泄漏

Java 2D游戏内存泄漏,java,Java,这是我第一次使用stackoverflow,希望在理解我遇到的问题时得到一些帮助。如果时间允许的话,我已经花了几个月的时间在一个2D小游戏上,但是我想我在绘制图形或者至少在代码的某个地方遇到了内存泄漏。一切正常,游戏运行,所有图像渲染等等,但昨晚我决定看看运行程序时cpu和内存是如何工作的。我注意到随着时间的推移,记忆一直在增长。超过10-15分钟可以从50mb左右增长到150mb。我注释掉了一段代码,在这段代码中绘制了图形,并触发了计时器的动作。我认为罪魁祸首就在附近的某个地方,因为我没有看到

这是我第一次使用stackoverflow,希望在理解我遇到的问题时得到一些帮助。如果时间允许的话,我已经花了几个月的时间在一个2D小游戏上,但是我想我在绘制图形或者至少在代码的某个地方遇到了内存泄漏。一切正常,游戏运行,所有图像渲染等等,但昨晚我决定看看运行程序时cpu和内存是如何工作的。我注意到随着时间的推移,记忆一直在增长。超过10-15分钟可以从50mb左右增长到150mb。我注释掉了一段代码,在这段代码中绘制了图形,并触发了计时器的动作。我认为罪魁祸首就在附近的某个地方,因为我没有看到在评论这件事时记忆不必要地增长

在绘制图形的类中,我创建并存储了一个大约为864x768的缓冲图像,并使用各种较小的32x32图像进行合成

我使用一个javax.swing.Timer,它每隔一段时间就会触发一次,在action performed方法中,我只运行一个方法update(),它检查播放器输入,然后通过buffered image subimage方法获取大缓冲图像的子图像,并将其显示在画布上

我想这可能与计时器有关,但不确定

下面是一些代码:

    private BufferedImage map;
    private Timer timer;            
    private BufferStrategy bs;
    private Graphics g;
    private boolean isInitialized; 

    public class World extends Canvas implements ActionListener {

        public World() {
            isInitialized = false;
            timer = new Timer(25, this);
            timer.setInitialDelay(100);
            timer.start();
        }   

        @Override
        public void actionPerformed(ActionEvent e) {
            if(!isInitialized) {
                createBufferStrategy(3);
                bs = getBufferStrategy();
                isInitialied = true;
            }
            update();
        }

        public void update() {
            player.input();
            g = bs.getDrawGraphics();
            BufferedImage temp = map.getSubimage(x, 
                y, viewWidth, viewHeight);
            g.drawImage(temp, 0, 0, null);
            g.drawImage(player, playerX, playerY,
                null);
            bs.show();
            g.dispose();
        }

    }
提前谢谢

编辑:

好吧,在花了一些时间研究垃圾收集、JVM等之后,我发现我不理解这些东西在基本层面上是如何工作的。我分析了这个项目,发现GC可以按预期工作,等等。所以总的来说,我认为是内存泄漏的情况并不一定是这样。我最初担心的是,在windows任务管理器中,我看到内存不断增长,而且进程从未稳定下来,而我只是知道,从代码、第二次检查、尝试不同的代码等方面来看,这不可能是正确的。知道现在所知,我感觉好多了

此外,我采用了以下方法:

public abstract boolean drawImage(Image img, int dx1, int dy1, int dx2,
    int dy2, int sx1, int sy1, int sx2, ImageObserver observer)
代替: BuffereImage temp=map.getSubimage(x、y、viewWidth、viewHeight); g、 drawImage(临时、0、0、空)

现在我遇到了一个不同的问题。在我的桌面上,我用它来编程和测试游戏,一切都运行得很好,就像我在后台没有应用程序的情况下测试游戏一样。然而,当我打开浏览器,尝试在youtube或netflix上观看一些东西,然后试运行游戏时,会有一个毫秒的暂停(25-50毫秒)。这种停顿每秒钟都会发生,这是显而易见的,绝对不是你想要的!我运行了一些测试,它只在这个绘制方法中发生:

公共抽象布尔绘图图像(图像img、int dx1、int dy1、int dx2、, int dy2、int sx1、int sy1、int sx2、ImageObserver)

但同样,仅在特定场景中,即使在该场景中,每次都会在1-2毫秒内完成,除非在一秒钟或接近一秒钟后,否则会有延迟


有什么想法吗

我看不到您正在刷新
buffereImage
的任何地方,因此它将保留以前分配的所有内存


使用完
BufferedImage temp
值后,需要使用
temp.flush()
刷新它,无需获取子图像以将其绘制到
图形中

public abstract boolean drawImage(Image img,
                int dx1,
                int dy1,
                int dx2,
                int dy2,
                int sx1,
                int sy1,
                int sx2,
                int sy2,
                ImageObserver observer)

允许您指定要直接绘制的源图像部分:
sx1
中的
s
sy1
等参数表示“源”。

这不是内存泄漏。这就是Swing类和JVM的工作原理。您是否进行了堆转储并在那里查找任何异常?