Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java drawString方法的内存消耗失控。内存泄漏?(图片)_Java_String_Swing_Graphics_Memory Leaks - Fatal编程技术网

Java drawString方法的内存消耗失控。内存泄漏?(图片)

Java drawString方法的内存消耗失控。内存泄漏?(图片),java,string,swing,graphics,memory-leaks,Java,String,Swing,Graphics,Memory Leaks,编辑(解决方案):每次调用paintComponent方法时,我都会导出一个字体,然后每次都会使用几GB的内存创建一个新的字体对象 我目前正在开发一个小游戏作为一个大学项目,它进行得很好,但是我偶然发现了一些令人困惑的行为,当我调用repaint()时。游戏本身非常简单。只有一个播放器可以四处移动、跳跃,还有一个显示fps/窗口宽度和高度的小文本 我有两条线。一个是执行游戏逻辑,另一个是绘制/重新绘制 我注意到,随着时间的推移,我的应用程序将消耗多达几GB的内存。经过进一步调查,这种行为似乎是由

编辑(解决方案):每次调用paintComponent方法时,我都会导出一个字体,然后每次都会使用几GB的内存创建一个新的字体对象

我目前正在开发一个小游戏作为一个大学项目,它进行得很好,但是我偶然发现了一些令人困惑的行为,当我调用
repaint()
时。游戏本身非常简单。只有一个播放器可以四处移动、跳跃,还有一个显示fps/窗口宽度和高度的小文本

我有两条线。一个是执行游戏逻辑,另一个是绘制/重新绘制

我注意到,随着时间的推移,我的应用程序将消耗多达几GB的内存。经过进一步调查,这种行为似乎是由调用
paintComponent
方法中的
drawString
方法引起的,该方法在我重新绘制屏幕时被调用(a
JPanel

即使我限制每秒调用repait方法的次数,行为也保持不变

但是如果我注释掉对
drawString
方法的调用,我的应用程序突然只消耗大约20到50兆的内存

以下是一个电话的样子:

g.drawString("FPS: " + this.getFPS() + " width: " + this.getWidth() + " height: " + this.getHeight(), 10, 15);

我用Java VisualVM检查了内存行为。也许有人知道这里发生了什么

“内存泄漏?”否。除非出现
OutOfMemoryError
,否则不会。如果不能做到这一点,那就是过早的优化,因为JVM只在认为有必要时才运行GC,那么如果您将行简化为类似于
g.drawString(“test”,10,15)
的内容呢。你还明白这个问题吗?可能是getFPS()的问题。我只是觉得在屏幕上绘制文本不应该占用千兆字节的内存。即使我执行类似“g.drawString(“hello”,5,5)”之类的操作,问题仍然存在。内存消耗似乎在大约3分钟后停止,但随后应用程序冻结。您是否在绘制或删除旧绘制的字符串之前清除画布?如果您不断创建新元素,但从未删除对旧元素的引用,我可以看到这种行为发生。Mh。我只是调用重新绘制,但并没有特别清除帧。我该怎么做,因为“removeAll()”似乎不能产生预期的结果。