【发布时间】: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