【问题标题】:Java heap memoryJava堆内存
【发布时间】:2021-07-23 15:17:32
【问题描述】:

我有一个关于 Java 堆空间的问题。

我有一个程序,它使用地理工具从街道网络创建图表。 我用它做了一些事情,但我遇到了 OutOfMemoryError 但我不确定为什么。我使用以下代码来获取可用内存量。

Runtime rt = Runtime.getRuntime();
long maxMb = rt.freeMemory()/(1024*1024);
System.out.println("Your JVM has " + maxMb + " MB of memory left");

当我运行我的程序时,似乎有足够的内存(见输出)。此控制台输出在 OutOfMemory 错误发生之前完成。那么出了什么问题呢?当我扩大 Java 堆空间时,仍然发生 OutOfMemory 错误(但还剩 1461 MB)。我不知道为什么会这样?有什么想法吗?

Your JVM has 981 MB of memory left
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.util.Arrays.copyOf(Unknown Source)
at java.util.ArrayList.grow(Unknown Source)
at java.util.ArrayList.ensureCapacityInternal(Unknown Source)
at java.util.ArrayList.add(Unknown Source)
at masterthesis.datastructures.Stroke.addStrokeSegment(Stroke.java:78)
at masterthesis.algorithms.StrokeBuilder.buildStroke(StrokeBuilder.java:145)
at org.geotools.test.Main.main(Main.java:109)

【问题讨论】:

  • 可能存在内存泄漏(或)您正在加载的图像大于可用堆?
  • 这个程序除了你给的 2 行之外还有更多吗?
  • 这是一个相当大的程序。但主要部分是它有一个来自包含 800 条街道(线串)的 shapefile 的街道网络。我所做的是使用 geotools 中的图形构建器创建一个图形,然后遍历所有节点并构建所谓的笔划(= 具有小偏转角的线串集)。在此期间,会发生错误。

标签: java memory heap-memory


【解决方案1】:

以下是调试 OOM 的一种方法。

  1. 将最大堆大小调整为合理的大小,例如256 MB。将其保持在合理的低水平将有助于您完成第 3 步。
  2. 将 -XX:+HeapDumpOnOutOfMemoryError 添加到命令行。这将在遇到 OOM 后转储内存。
  3. 打开Eclipse Memory Analyzer 中的转储并尝试分析最大的对象。它可以生成类似这样的报告。

【讨论】:

  • 感谢您的回答。我去看看
【解决方案2】:

由于输出表明您有大量内存剩余并且在数组列表增长期间发生错误,我猜测您有一个非常巨大的数组列表,您可以将对象放入其中。当 JVM 尝试增加您的列表时没有足够的堆空间来容纳翻倍的列表。

我会用addStrokeSegment() 调查您实际在列表中放入了多少对象。

【讨论】:

  • 我想就是这样。当我在插入之前检查尺寸时,即使它不应该是巨大的。我会尝试找出错误,但如果我不能,我会回来;)
  • 发现错误。这是一个非常讨厌的无限 for 循环,它不断调用 addStrokeSegment() 方法来生成一个巨大的数组列表。再次感谢!问题解决了
【解决方案3】:

您应该使用jmap 来了解您的记忆中的内容。

【讨论】:

    【解决方案4】:

    尝试阅读Java: OutOfMemoryError Exception and freeMemory()

    Runtime.freeMemory() javadoc 说这是返回“当前可用于未来分配对象的内存总量的近似值”

    所有动态结构的工作方式是它们以块的形式分配内存。当 HashMap 变满时,它不会再为一个对象分配额外的空间。它分配了一些大小的块。我不知道它在 JVM 中的确切工作方式,但它可能会尝试分配两倍于当前使用的内存量。

    【讨论】:

      猜你喜欢
      • 2011-07-23
      • 1970-01-01
      • 2021-09-26
      • 2013-03-01
      • 2013-09-10
      • 2023-03-31
      • 2011-03-27
      • 2012-04-27
      • 1970-01-01
      相关资源
      最近更新 更多