Java graphics.getDrawGraphics()内存消耗高

Java graphics.getDrawGraphics()内存消耗高,java,memory,memory-management,graphics2d,Java,Memory,Memory Management,Graphics2d,getDrawGraphics方法存在内存使用率高的问题。这使我产生了线性内存消耗。除了从一个线程每16毫秒~60帧调用一次外,我什么也不做,从30Mb内存使用率提高到超过100Kb,平均每秒增加100Kb。有时,甚至是1~7Mb。这里是myRepaint方法。是的,我已经在setIgnoreRepainttrue之前添加了 public void myRepaint(){ if(repaintInProgress) return; repaintInProgress = tru

getDrawGraphics方法存在内存使用率高的问题。这使我产生了线性内存消耗。除了从一个线程每16毫秒~60帧调用一次外,我什么也不做,从30Mb内存使用率提高到超过100Kb,平均每秒增加100Kb。有时,甚至是1~7Mb。这里是myRepaint方法。是的,我已经在setIgnoreRepainttrue之前添加了

public void myRepaint(){
    if(repaintInProgress) return;
    repaintInProgress = true;

    BufferStrategy strategy = getBufferStrategy();
    Graphics2D graphics = (Graphics2D) strategy.getDrawGraphics();
    /* draw graphics here */
    if(!loadedMap){
        drawMap(graphics);
        loadedMap = true;
    }
    drawTowers(graphics);
    drawCreeps(graphics);
    if(graphics != null) graphics.dispose();
    strategy.show();
    Toolkit.getDefaultToolkit().sync();
    repaintInProgress = false;
}
我尝试清除此函数中的所有行。内存消耗是稳定的,这意味着此特定方法导致内存问题。在逐行搜索之后,我发现getDrawGraphics是这个问题的根源。因此,我尝试在myRepaint中只使用以下3行代码:

BufferStrategy strategy = getBufferStrategy();
Graphics2D graphics = (Graphics2D) strategy.getDrawGraphics();
graphics.dispose();
这让我相信,无论graphics.dispose是否正常工作,或者是否拥有8Gb的RAM,Java都不会释放这些内存。我查了三遍。我没有在方法执行期间实例化任何对象,因此没有理由增加内存使用。为了跟踪它,我使用Windows任务管理器


有什么问题吗?如何解决此问题?

首先,使用任务管理器进行概要分析可能不是一个好主意。如果您使用的是Oracle虚拟机,请使用VisualVM或Java任务控制,它将向您显示一个随时间变化的内存使用情况的良好图表,并使您能够更详细地分析内存使用情况。我不明白。VisualVM说我只使用了7Mb的堆,而TaskManager说我使用了超过80Mb的堆。有趣的是:如果我不使用getDrawGraphics,任务管理器说我的应用程序只使用31Mb。这个特殊的方法是让任务管理器告诉我我正在使用更多的内存。那么,我能相信VisualVM吗?如果可以的话,我的问题就解决了,尽管window的行为真的很有趣