我写了这段代码:
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。 奇怪
答案 0 :(得分:1)
Java不允许原始数据类型的映射。因此,如果您正在使用Hashmap,则必须支付装箱/拆箱和对象引用的开销。 为避免开销,您可以编写自定义散列映射或使用one of those libs中的现有实现。
答案 1 :(得分:0)
您不应该在地图中放置数百万个项目。 Long
是一个包含8字节long
字段的对象,加上一些对象开销。然后,每个映射条目使用两个实例。
由于键是数字键,您可以(如果最大键值足够低)使用数组作为&#39; map&#39;。
long[] mappp = new long[4000000]; // takes 4M * 8 = 32M memory
如果您需要知道某个值是否未在地图中显示,请使用0
作为该值。如果0需要在你的地图中,你可以做一些技巧,比如将所有值增加1(如果值总是正数)。