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