繁体   English   中英

哈希表<Long,Long>需要更多内存

[英]HashMap<Long,Long> needs more 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 heap space

我计算了内存中需要多少内存才能拥有这样的 HashMAp,在我看来,我的计算机内存就足够了。 我的计算机上有 1024 个 RAM。 我使用日食。 还设置了参数:我正在从命令行启动 eclipse:'eclipse -vmargs -Xms512m -Xmx730m' 第二个来自运行配置我设置了选项卡参数:'-Xmx730m' 这仍然给 java. lang.OutOfMemoryError。 这是什么原因? 附: 只是补充一些奇怪的事实 - 在 eclipse 的右下角显示了堆内存使用情况,它被写入了 495M 中的 130M。 那么,当HashMap mappp的大小增加时,这个信息'130M of 495M'是否必须改变,例如'357M of 495M',1秒后变为'412M of 495M'等等才能达到这个495M?在我的情况下,这个 130M 保持不变,只是有点变化,从 130M 到 131M 或到 132M。 奇怪的

Java 不允许原始数据类型的映射。 因此,如果您使用 Hashmap,您将不得不为装箱/拆箱和对象引用的开销付费。 为了避免开销,您可以编写自定义哈希映射或使用这些库之一中的现有实现。

java中的装箱和拆箱

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

由于键是数字,您可以(如果最大键值足够低)使用数组作为“映射”。

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

如果您需要知道某个值是否“不在地图中”,请使用0作为该值。 如果 0 需要在您的地图中,您可以执行一些技巧,例如将所有值增加 1(如果值始终为正)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM