java 基础问题。

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()的总和

就不应该这么做,加大内存根本就不是好办法,只是权宜之计,如果你的数据库有几亿数据,你多少内存也不够用啊。分页就是一种解决思路。