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)