"Memory leak" 或可预期

10 浏览
0 Comments

"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使用率保持稳定。

admin 更改状态以发布 2023年5月22日
0
0 Comments

简短回答:没有泄露。\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所以再次没有发现泄漏。

0