ArrayList java.lang.OutOfMemoryError:Java堆空间

时间:2018-04-19 00:21:38

标签: java arraylist heap-memory

我需要在列表中存储大量(~4294967294)个对象,但我得到的是异常。请建议如何使用java-8存储和处理大量对象。

代码:

List<String> ipv4FreeAddress = new ArrayList<String>();

for (long i = longValueFrom; i <= longValueTo;  i++) {
                    ipv4FreeAddress.add(DimNumber.getIPFromNumber(String.valueOf(i)));
}

错误:

Caused by: java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:3181)
    at java.util.ArrayList.grow(ArrayList.java:261)
    at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:235)
    at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:227)
    at java.util.ArrayList.add(ArrayList.java:458)

2 个答案:

答案 0 :(得分:0)

如果您需要在列表中存储40亿个项目,则可能有更有效的方法。我不知道你需要什么,所以我无法告诉你使用什么方法。由于看起来您正在比较IPv4地址,因此您可以创建一个函数来即时比较它们而不是列表。

答案 1 :(得分:0)

你有没有做过一些估计? 您可以在int []中将ipv4存储为int(小心处理符号)。

即使这样,4Gi * 4也是16GiB的内存。你最好有ram(除非你存储到磁盘)并且已经将-Xmx设置得足够高(例如:java -Xmx20g ...)

同时,如果你跳过多播ip范围,你可以保存一些ips,如果你不关心那些。

但最重要的问题是你想要做什么需要这样一个实时结构?