"Memory leak" 或可预期
"Memory leak" 或可预期
今天我发现我的程序会慢慢地占用内存。我用Java VisualIVM来检查并了解更多信息。我对这个还很陌生。我正在使用Java8和Swing编码来负责游戏。
请注意,除了渲染对象外,不应该发生任何事情。
没有新的实例或任何其他东西。
游戏循环看起来是这样的
while (running) try render all drawables at optimal fps try update all entities at optimal rate sleep if there is time over
在20分钟的时间里,我找到了如下情况
- 休眠是有效的,它会让大部分时间给出。
- 5个类在运行时加载了一些时间。
- 该游戏在首次启动时使用约70 MB。(到目前为止,据我所知,所有的东西都已加载。)
- 在最初的70 MB之后,迅速占用了15 MB的RAM,然后缓慢增加。现在总共占用了100 MB。
- CPU使用似乎很正常,在我的i-2500k上大约为7%。
- 堆大小已增加一次。使用的堆从未超过50%。
如果我注释掉游戏循环中除了while (running {}
部分之外的所有内容,我会得到更少的泄漏,但仍会发生。
这是正常的,还是我需要深入挖掘?如果我需要深入挖掘,有人可以指导我应该看什么吗?
现在经过25分钟,它已经达到了102 MB的RAM。这意味着泄漏更少,而且更小。
提醒一下,我不太擅长这个。这是我第一次用这种方法调试我的项目。请记住这一点。
更新
大约40分钟后,它会定格在101到102 MB的RAM使用上。它已经15分钟没有超过这个数值了。它有些上下波动。
堆大小越来越小。 CPU使用率保持稳定。
简短回答:没有泄露。\n\n解释:\n\n参考以下问题。\n\nSimple Class - Is it a Memory Leak?\n\nTracking down a memory leak / garbage-collection issue in Java\n\nCreating a memory leak with Java\n\n以及这篇文章。\n\nhttp://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html\n\n正如我在问题中提到的。我非常新手。触发我的是我检查了Windows任务管理器,发现我的应用程序的内存使用量增加了。所以我决定进一步挖掘。我学了几件事情。\n\nJava的垃圾回收被我大大低估了。如果你的意图是引起内存泄漏,它是混乱的。但是如果有线程涉及到的话,它可能会有问题。这抓住了我的注意,因为我在我的项目中正在使用线程。\n\nWindows提供的工具是次优的,我推荐使用外部工具。我使用了Java VisuaIVM。在这个工具中,我发现在游戏的前两分钟加载了许多类。五点多一点。一些最早创建的是JVM创建的字符串引用。\n\n“Thread.sleep可能在内部分配对象。”——我发现它确实是这样,甚至有5个。这解释了我的最初的“5个类在运行时间内的某个时间被加载”。它们做什么我还不知道。\n\n大约有10-15MB是我做的分析。我希望我不是那么的新手。\n\n所以再次没有发现泄漏。