Java 大地图冻结了我的程序
我有一张很大的地图,在那里我存储了一些对象。地图很大:大约有200k个对象。当我尝试运行一些需要读取映射值的方法时,程序冻结。当我调试它时,我的IDE似乎正在“收集数据”(图)。它从未完成这项任务 我有16GB内存。 我可以做些什么来加快速度?看看-作为解决方案,您可以增加应用程序的堆大小: java-XMX6GmyProgramJava 大地图冻结了我的程序,java,Java,我有一张很大的地图,在那里我存储了一些对象。地图很大:大约有200k个对象。当我尝试运行一些需要读取映射值的方法时,程序冻结。当我调试它时,我的IDE似乎正在“收集数据”(图)。它从未完成这项任务 我有16GB内存。 我可以做些什么来加快速度?看看-作为解决方案,您可以增加应用程序的堆大小: java-XMX6GmyProgram 但是它不是很好。我建议您尝试重新设计您的数据处理方法。也许您可以在获取数据之前应用一些过滤,以减小数据大小或在数据库级别执行一些计算。我遇到了大约6100万个元素的
但是它不是很好。我建议您尝试重新设计您的数据处理方法。也许您可以在获取数据之前应用一些过滤,以减小数据大小或在数据库级别执行一些计算。我遇到了大约6100万个元素的性能问题
import java.util.*;
public class BreakingMaps{
public static void main(String[] args){
int count = Integer.MAX_VALUE>>5;
System.out.println(count + " objects tested");
HashMap<Long, String> set = new HashMap<>(count);
for(long i = 0; i<count; i++){
Long l = i;
set.put(l, l.toString());
}
Random r = new Random();
for(int i = 0; i<1000; i++){
long k = r.nextInt()%count;
k = k<0?-k:k;
System.out.println(set.get(k));
}
}
}
您好,在执行过程中是否在映射中插入元素?映射中存储了什么对象类型?分配给JVM的RAM有多少?你能用jconsole监控RAM的使用情况吗?(你也应该考虑地图上的物体有多大)你的地图是什么?您已经尝试了什么?您正在使用哪个jvm?对象是否正确重写equals和hashcode?这可能是大量冲突的结果。也许可以查看您的哈希代码,并尝试对其进行改进,以避免生成重复项。映射中的200K元素并不太多,并且可能不会导致性能下降。
static class Key{
final long l;
public Key(long l){
this.l = l;
}
@Override
public int hashCode(){
return 1;
}
@Override
public boolean equals(Object o){
if(o!=null && o instanceof Key){
return ((Key)o).l==l;
}
return false;
}
}