程序的开始是读入一个文件里的数据,数据的格式是:
每一行为三个字段,例如:
2,3,0
并且1-50行的第一个数字相同,51-100行的第一个数字相同,以此类推。
一共是1.2亿行。我把它读到一个字典里面。我用的数据结构是:HashMap<Integer,LinkedList<Node>>
键是每一行的第一个数字,值是一个LinkedList,Node有两个字段:
Node{
int ID;
int distance;
}
分别是每一行的第二个数字和第三个数字。也就是说每一行会产生一个node。
然后每50行放入一个LinkedList,再put进hashmap里面。我估算了一下,需要的内存是:
0.12G*(4+4+4)=1.44G
4是int类型占的字节数。加上node封装,linkedlist的使用可能会需要一些额外的内存,我给java虚拟机分配了6G的内存上线。
程序运行的时候,发现开始读入的速度还是很快的,内存涨的很快,但cpu一直维持在较低水平,大概40-50%,但是当读入到2300万行的时候就卡主了,多次运行到这时都停住了,任务管理器显示java程序只占用了2.3G的内存,但很快cpu使用率达到了100%。
我想问下大家,这是什么原因呢,是因为我使用了Node封装和LinkedList导致需要更多的内存吗。需要多多少呢。而且为什么我为这个java程序分配了6g的内存,就算是内存不足,也不应该卡在2.3G这个地方啊。难道是我分配内存的方法不对?大家都是怎么给某个java程序单独分配内存的?
拜谢各位啊。
每一行为三个字段,例如:
2,3,0
并且1-50行的第一个数字相同,51-100行的第一个数字相同,以此类推。
一共是1.2亿行。我把它读到一个字典里面。我用的数据结构是:HashMap<Integer,LinkedList<Node>>
键是每一行的第一个数字,值是一个LinkedList,Node有两个字段:
Node{
int ID;
int distance;
}
分别是每一行的第二个数字和第三个数字。也就是说每一行会产生一个node。
然后每50行放入一个LinkedList,再put进hashmap里面。我估算了一下,需要的内存是:
0.12G*(4+4+4)=1.44G
4是int类型占的字节数。加上node封装,linkedlist的使用可能会需要一些额外的内存,我给java虚拟机分配了6G的内存上线。
程序运行的时候,发现开始读入的速度还是很快的,内存涨的很快,但cpu一直维持在较低水平,大概40-50%,但是当读入到2300万行的时候就卡主了,多次运行到这时都停住了,任务管理器显示java程序只占用了2.3G的内存,但很快cpu使用率达到了100%。
我想问下大家,这是什么原因呢,是因为我使用了Node封装和LinkedList导致需要更多的内存吗。需要多多少呢。而且为什么我为这个java程序分配了6g的内存,就算是内存不足,也不应该卡在2.3G这个地方啊。难道是我分配内存的方法不对?大家都是怎么给某个java程序单独分配内存的?
拜谢各位啊。
