HashMap <long,long>需要更多内存

时间:2016-05-08 18:14:28

标签: java eclipse out-of-memory

我写了这段代码:

public static void main(String[] args) {
    // TODO Auto-generated method stub
    HashMap<Long,Long> mappp = new HashMap<Long, Long>(); Long a = (long)55; Long c = (long)12;
    for(int u = 1;u<=1303564/2 + 1303564/3;u++){

        mappp.put(a, c);
        a = a+1;
        c = c+1;
    }
    System.out.println(" " + mappp.size());
}

并且它没有完成,因为程序停止并且控制台中显示消息:

  

线程“main”中的异常java.lang.OutOfMemoryError:Java堆空间

我计算了我需要在内存中使用这样的HashMAp的内存,在我看来我的计算机内存就足够了。我的电脑上有1024个RAM。 我用eclipse。还设置了参数: 我从命令行启动eclipse:'eclipse -vmargs -Xms512m -Xmx730m' 第二个来自运行配置我已经设置了标签Arguments:' - Xmx730m' 这仍然给出了java.lang.OutOfMemoryError。  这是什么原因? PS。只是为了添加一些奇怪的事实 - 在eclipse的右下角显示了堆内存使用情况,它写成了130M的495M。 那么,当HashMap mappp的大小增加时,这个'130M的495M'信息是否必须改变,例如'357M的495M',1秒后是'412M的495M'等等以便达到这个目的495M?在我的情况下,这130M保持不变,只是稍微改变,从130M到131M或132M。 奇怪

2 个答案:

答案 0 :(得分:1)

Java不允许原始数据类型的映射。因此,如果您正在使用Hashmap,则必须支付装箱/拆箱和对象引用的开销。 为避免开销,您可以编写自定义散列映射或使用one of those libs中的现有实现。

boxing and unboxing in java

答案 1 :(得分:0)

您不应该在地图中放置数百万个项目。 Long是一个包含8字节long字段的对象,加上一些对象开销。然后,每个映射条目使用两个实例。

由于键是数字键,您可以(如果最大键值足够低)使用数组作为&#39; map&#39;。

long[] mappp = new long[4000000]; // takes 4M * 8 = 32M memory

如果您需要知道某个值是否未在地图中显示,请使用0作为该值。如果0需要在你的地图中,你可以做一些技巧,比如将所有值增加1(如果值总是正数)。