编辑(解决方案):每次调用paintComponent方法时我都会派生一个字体,然后每次使用几千兆字节的内存时都会创建一个新的字体对象。
我目前正在开发一个小型游戏作为一个大学项目,它的表现非常好,但我偶然发现了一些令人困惑的行为,当我打电话给repaint()
时。游戏本身非常简单。只有一个玩家可以四处移动,跳跃和一个小文本显示窗口的fps /宽度和高度。
我有两个主题。一个是执行游戏逻辑,一个是绘画/重新绘制。
我注意到我的应用程序会随着时间的推移消耗高达几千兆字节的内存。经过进一步调查后,似乎这种行为是由调用drawString
方法中的paintComponent
方法引起的,当我重新绘制屏幕时调用JPanel
方法。{/ p>
即使我限制每秒调用重绘方法的次数,行为也保持不变。
但如果我注释掉drawString
方法的调用,我的应用程序突然只消耗大约20到50兆字节的内存。
以下是电话的内容:
g.drawString("FPS: " + this.getFPS() + " width: " + this.getWidth() + " height: " + this.getHeight(), 10, 15);
我使用Java VisualVM检查了内存行为。也许有人知道这里发生了什么。