我用JAVA读数据库中某个表的数据,这个表大概有27W条记录,我想一次性都读出来放到Arraylist里面。但总是出现OutOfMemory的异常错误:Exception in thread "Timer-0" Exception in thread "main" java.lang.OutOfMemoryError: Java heap space我设置了eclipse.ini中内存的分配后还是有问题。eclipse.ini的设置:-showsplash
com.genuitec.myeclipse.product
--launcher.XXMaxPermSize
256m
-vmargs
-Xms512m
-Xmx768m
-Duser.language=en
-XX:PermSize=64M
-XX:MaxPermSize=256M机器是XP系统,2G内存
请高手不吝赐教啊!
com.genuitec.myeclipse.product
--launcher.XXMaxPermSize
256m
-vmargs
-Xms512m
-Xmx768m
-Duser.language=en
-XX:PermSize=64M
-XX:MaxPermSize=256M机器是XP系统,2G内存
请高手不吝赐教啊!
无论谁挂了,都不能得到正确的结果。
再说,一次1万条,读27次,不至于就把数据库搞死吧?
还有,你不会频繁的读这27万条数据吧?
在数据库里做索引,做view。这样不就快了么
我晕,数据库压力是小了,但是服务器的压力成批成批地增加了!不要想把 27 万的数据全部塞到内存中,即使是扩大 JVM 内存也是无济于是的,只能治标治不了本的。
你的字段都是些啥数据啊?
再检查检查你的代码吧;应该是其他的问题造成不行debug一下,把生成100个或者1000个的时候的jvm内存打印出来看看;
还有,为什么你会觉得每次读取数据库会影响你的系统速度,你对此有什么依据么?你做过测试,这种影响足以影响到用户体验与系统稳定性么?你不会是想用一个有很明显问题的处理方式来处理一个没有经过任何验证的莫须有的问题吧?
而且就算你觉得每次都去访问数据库会影响速度,即使那个是真的影响到用户体验与系统稳定性,现在已经有很多现成技术,例如连接池,你的系统有连接池么?不会每次都会打开一个connection吧?你的系统有数据缓存么?每次处理相同数据的时候会不会都会去数据库里面挖数据?
如果你是在做一个用作生产系统,我对你天真的想法感到遗憾,做系统是需要严谨的,不能跟着感觉走,要测试与验证,也许你担心的问题根本就不是一个问题,而你提出的解决方案本身就是一个问题。
建议优化数据库,提高数据库响应能力。
如果IP库是静态的,可以考虑以文件形式存放,人工有针对性的优化存储结构。
1.xxx.xxx.xxx 放到 IPMap_001 表中
2.xxx.xxx.xxx 放到 IPMap_002 表
3.xxx.xxx.xxx 放到 IPMap_003 表
......
254.xxx.xxx.xxx 放到 IPMap_254 表
这样每个表中存放的数据量会少很多,查询速度比放到一个表中要快2、参考操作系统虚拟内存的交换算法,即创建一个固定长度的列表,当客户进行查询时,先到内存列表中找,如果找到则返回内存中的数据,如果没有找到,则到数据库中查询数据返回给客户,同时把查到的数据存添加到列表中,如果列表已满,则从列表中将最长时间没有被访问过的数据淘汰出列表。3、添加一块固态硬盘,专用存放对访问速度要求高,并且读取数据频繁的数据
还有,Eclipse不能运行那个程序,可能是设置得不正确,而不是内存不足的问题。
在SQL语句上加个从某个范围到某个范围
Mysql 是limit ,Oracle 是 rowcount,具体可以自己查查