Java HashMap<;长,长>;需要更多的记忆
我写了这段代码:Java HashMap<;长,长>;需要更多的记忆,java,eclipse,out-of-memory,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++){
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());
}
publicstaticvoidmain(字符串[]args){
//TODO自动生成的方法存根
HashMap mappp=newhashmap();长a=(长)55;长c=(长)12;
对于(int u=1;u您不应该在一个映射中放置数百万项。Long
是一个包含8字节Long
字段的对象,加上一些对象开销。然后,每个映射条目使用两个实例
由于键是数字的,所以可以(如果最大键值足够低)使用数组作为“映射”
long[] mappp = new long[4000000]; // takes 4M * 8 = 32M memory
如果需要知道某个值是否“不在映射中”,请使用该值的0
。如果需要在映射中使用0,则可以执行一些技巧,如将所有值增加1(如果值始终为正值).Java不允许对原始数据类型进行映射。因此,如果使用Hashmap,则必须为装箱/取消装箱以及对象引用的开销付费。
为了避免开销,您可以编写自定义hashmap或使用现有的实现
程序参数,或VM参数?Long不需要8字节来计算程序将占用多少内存?1024 RAM只有在速度至少为30的情况下才有帮助。在页面末尾的这个站点上,有一个表,写着HashMap需要:32*大小+4*容量字节。因此,一个条目是64位+64位=16字节。这16字节乘以1303560,得到1303560*16/(1000*1000)MB=20MB。这和32*SIZE=32字节*1303560/(1000*1000)=41MB相加,所以这里20+41=61MB,最后这个4*容量我忽略了,以40MB为例(但可能我夸大了它)所以全部是61+40=100MB。谢谢你的回复。我不能使用数组,因为我的键值非常大,有点像2^50,但我的程序不需要将1到2^50之间的所有整数作为哈希图中的一个键,所有键的数目都是250万个,每个键的值都在1到2^50之间。在我上面的帖子中,我没有解释所有的他的,因为我想尽可能地简化一切。如果我知道如何用内存解决上述问题,我就会知道如何解决我真正的问题。而且我仍然不明白为什么会出现内存不足。对于这样的java应用程序,300MB或400MB就足够了。试着用初始化参数实例化HashMap
。哟你看,有时需要调整哈希表的大小,因为超出了加载因子(默认为75%),所以内存中暂时存在两个哈希表。尝试使用2500000/0.75的初始容量和1.0的加载因子实例化:newhashmap(3333333,1)