java - 内存泄漏或者是预料之中的

标签 java memory-leaks

今天我注意到我的程序慢慢地消耗内存。我检查了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 分钟内发现的情况,发生了以下情况。

  • sleep 很有效,大部分时间都是在休息。
  • 5 个类在运行时加载一段时间。
  • 游戏首次启动时使用约 70 MB。 (据我所知,此时所有内容都已加载。)
  • 最初的 70 MB RAM 很快就被占用了 15 MB。随后缓慢增加。现在总共占用了 100 MB。
  • CPU 使用率看起来很正常,在我的 i-2500k 上约为 7%。
  • 堆大小已增加一次。使用的堆从未超过 50%。

如果我对游戏循环中除 while (running {} 部分除外) 中的所有内容进行注释,我得到的泄漏会更少,但它们仍然会发生。

这是正常现象还是我应该深入挖掘?如果我需要更深入地挖掘,有人可以指出我要照顾什么的方向。

现在 25 分钟后,RAM 已达到 102 MB。这意味着泄漏越来越小。

提醒一下,我不太擅长这个。我第一次尝试以这种方式调试我的项目。请记住这一点。

更新

大约 40 分钟后,RAM 使用量稳定在 101 到 102 MB。现在已经有 15 分钟没有超过这个值了。它有点上下。

堆大小越来越小。 CPU 使用率稳定。

最佳答案

简短回答:没有泄漏。

说明

使用这些问题作为引用。

Simple Class - Is it a Memory Leak?

Tracking down a memory leak / garbage-collection issue in Java

Creating a memory leak with Java

还有这篇文章。

http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

正如我在问题中提到的。我对此很陌生。触发我的是,我检查了 Windows 任务管理器,发现我的应用程序的内存使用量有所增加。所以我决定深入挖掘。我学到了一些东西。

  • 我大大低估了 Java 垃圾收集。如果这是你的意图,那么导致内存泄漏是很困惑的。然而,当涉及线程时,可能会出现问题。当我在项目中使用线程时,这引起了我的注意。

  • Windows 提供的工具较差,我建议使用外部工具。我使用了 Java VisuaIVM。在这个工具中,我发现游戏的前 2 分钟会加载大量的类。还有 5 个。首先创建的一些是 JVM 生成的 String 引用。

  • “Thread.sleep 可能会在幕后分配对象。” ——我发现它有这些作用。一共5个连。这解释了我最初的“5 个类在运行时加载了一段时间。”。我目前还不知道他们在做什么。

  • 大约 10 - 15 MB 来 self 所做的分析。我希望我不是这样的菜鸟。

所以我再次没有发现泄漏。

关于java - 内存泄漏或者是预料之中的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27424315/

相关文章:

c - 只是一个循环,还有 33 个泄漏

jakarta-ee - CDI |应用程序/从属范围 |内存泄漏 - javax.enterprise.inject.Instance<T> 未收集垃圾

java - 在 JPA 中映射复杂的 Map

java - hibernate 条件 : Add restrictions to Criteria and DetachedCriteria

java - Centos Java 应用程序自动终止

java - 计算器程序中的用户输入错误

java - Java ReSTLet API 可以与 REST PHP API 一起使用吗?

c - tokyabinet 列表中的内存泄漏

memory-leaks - 内存泄漏循环 cffunction 内的 cfmodule

c - OpenSSL 函数 EVP_PKEY_keygen 中的内存泄漏