List list = new ArrayList();
UserAccount ua;
for(int i = 0 ;i<2000000;i++){
ua = new UserAccount();
ua.setUname("a"+i);
ua.setUpass("a");
ua.setUgroup("aa");
list.add(ua);
}
System.out.println(list.size());
这个相当与是数据库查出来2000000条记录。我把它封成对像,放到list中。。但。因数据太大。。每次都抛java.lang.OutOfMemoryError: Java heap space
因为每次都 在循环中new了一个对像。。。
这种应该怎么来处理呢?
[b]问题补充:[/b]
其实我就是有那个多条数据得嘛。。而且我只知道这么做。。。有没有好的例子,给我讲一讲,谢谢各位。
最好用分页查询.原则上,我们没有必要查询400万条数据集记录.如果是大型互联网公司,数据库记录每天的增长是几百万或则上一条.不能一次全部出来.
原因:如果你的Java 虚拟机运行在32的操作系统上,最大的寻址空间是4G.操作系统最大允许分配一半的空间,那么最大JVM允许访问2G的内存空间.所以2G内存不一定能容纳你的400万条记录.
目前64位的虚拟机还不稳定
王道: 分页是最好的选择
如果数据量的确需要,请使用缓存.
分页技术:
如果是hibernate已经提供封装了大部分数据的分页查询.
如果你用的jdbc或者是iBATIS,你的查看相应数据库的分页技术.一般情况下,在mysql中,用limit关键字实现.在Oracle中,用rownum实现.在ms sql server中,用top关键字.
[color=blue][b]
我觉得问题有以下几个方面:
1、循环的次数2000000,太大了
2、ArrayList的构造函数中,没有明确指定其长度。这样默认的长度是10,当你循环着添加元素时,ArrayList会自动的递增的改变长度。(注意:这个该变长度,包括新建一个容量较大ArrayList,copy原来ArrayList到新的,将引用指向新的ArrayList,原来的ArrayList就废弃了。)当要加入的元素很多时,会生成很多的废弃的ArrayList。
3、你ArrayList中的元素是一个类,而类中的setUname方法,用到了字符串的拼接。在循环的次数2000000时,也会有很多的String生成。
[/b][/color]
[color=blue][b]
可以改进的方面有:
尽量在构造时,指定ArrayList的容量;
加大JVM的内存;
[/b][/color]
加大jvm的内存。
Runtime.getRuntime().maxMemory(); //最大可用内存
Runtime.getRuntime().freeMemory(); //当前JVM空闲内存
Runtime.getRuntime().totalMemory(); //当前JVM占用的内存总数,其值相当于当前JVM已使用的内存及freeMemory()的总和
就不应该这么做,加大内存根本就不是好办法,只是权宜之计,如果你的数据库有几亿数据,你多少内存也不够用啊。分页就是一种解决思路。