当前位置: 代码迷 >> Java相关 >> 千里冰封进 by 万里燎原
  详细解决方案

千里冰封进 by 万里燎原

热度:300   发布时间:2008-02-26 15:36:15.0
千里冰封进 by 万里燎原
老大,新年好,一听万里燎原就知道我是谁了吧.
帮助一下.
我现在在做ERP,查询的数据量牛大,我用ArrayList<Stk>来装货物资料,而Stk本身就不小,结果超过一定数量
就会内存溢出(out of Memory),帮我看一下有什么类可以代替ArrayList的.(一定是jdk1.5,公司太土没办法)
而且因为原有代码量太大不可能用<<  临时表  >>代替,别一个就是也不能分页,因为要统计汇总.
搜索更多相关的解决方案: 千里冰封  内存  新年  燎原  ERP  

----------------解决方案--------------------------------------------------------
有两个办法
1.分页,统计汇总的时候可以通过数据库查询语句进行统计汇总,没必要放到JAVA中来完成
2.设置JVM参数,像我现在参与的项目,就必须要吧JVM的参数设置为1G,否则跑不动。参数为

-Xmx1024m
----------------解决方案--------------------------------------------------------
本来正统思路是这样做的,问题是它的汇总分析不是单纯的加加减减,它是把Stk_mas表的数据取一部分出来,组装成对象
然后再跟之前大量表生成的ArrayList<Object>和HashMap进行比对生成的结果,所谓一动动全身呢,误计要改上百个类,而且一出逻辑错误下面就不用做了.最后调用开元包开生板块图更是难改.至于把内存设大,我很早就知道了,现在我们工程就用调到256-512M内存,其实最根本问题是ArrayList支持不住.我看外国的网站,听说有什么内存数据库,或cache之类的,希望大家帮助解决后下,反正修改的原则只有一个就是拿大容量的向量或类代替ArrayList.
至于分页也是以上的问题,它不是单单的从数据库取东西出来显示.
----------------解决方案--------------------------------------------------------
这样,ArrayList实际上是一个数组。你可以考虑换个LinkedList看看,这是链表实现的。
----------------解决方案--------------------------------------------------------
另外,在add的时候,最好判断一下返回值,如果是false,那么最好再另外开一个集合类来存储,以避免单个集合类中占用空间过大。

那么大的数据量,莫非是BI,真是夸张,你们领导也不配置个好点的机器,咔咔
----------------解决方案--------------------------------------------------------
哈哈,你也来这里了,怎么不QQ呼我呢
----------------解决方案--------------------------------------------------------
这和大容器是没有关系的,你的内存溢出了是因为你的程序用了很多的内存,并不是ArrayList装不下你的数据,其实JAVA的集合框架来说,ArrayList是列表最好的选择,
你能否只能需要计算的数据.比如Stk类,它里面有哪些数据是不需要参与计算的,你就设计一个小一点的辅助类来装这些数据.这样就可以减小一些内存使用量了.
----------------解决方案--------------------------------------------------------
不知道你有没有空哦,我上线都不见你,所以都不敢随便打扰你哈。

我之所以推荐LinkedList,是因为考虑到ArrayList的实现比较特殊,ArrayList是在一开始的时候分配一定大小空间的内存使用,但是一旦用户存储的数据大小超过了原来分配的空间,那么ArrayList将会在内存中重新开辟一块更大的连续空间来存放新的数据,其大小为原来大小的2倍!

这样,假设原来ArrayList的大小为10M,那么当重新创建空间的时候将会分配20M的大小,然后是40M,80M....直到你内存耗尽。

这样做的主要目的是
1.保持连续的空间,提高ArrayList随即访问的优势。
2.减少分配内存的次数,因为每次分配内存,都要把原来旧的数据COPY到新的空间来,如果数据很大是很花费时间的。

基于以上理由,我提出用LinkedList代替ArrayList,不直到楼主是否成功了呢?
----------------解决方案--------------------------------------------------------
更正一下哦,ArrayList是一次性增长1.5倍,不是2倍,2倍太大了
倍增效应是不得了的
----------------解决方案--------------------------------------------------------
对老大说:1,Stk类已经有辅助类,问题是辅助类也不小(stk_mas表对应Stk类104列,客户分析时辅助类就用到50多列)2,做作一年的客户分析时把数据库查出的数据(16万左右)放到ArrayList<辅助类>时内存到100M就溢出了.但本身跑程序时就分配256-512M内存,根本没用完.
对神vLinux飘飘说:1,LinkedList也不行,测试很简单就是起一个for循环,死向ArrayList<Stk>扔就会溢出(注:LinkedList,Vector(增长100%),ArrayList(增长50%)我都试过)2,你那个在add时判断true和false的方法,比如:我第一个ArrayList
放满了,再new一个出来....到n个(直到放满了16万),问题是现在我怎么对这n个ArrayList取数据出来分析.
对神vLinux飘飘,老大说:你们说ArrayList倍增我都了解,问题出在ArrayList(包括LinkedList,Vector)在倍增时有没有用光分配的内存,实现上是没有.大个比方,你程序分配2M内存,但ArrayList在加数据时可能用1M就会溢出,就是说ArrayList使用内存是有固定大小的.
期望:找一个有数据库表机制的类代替ArrayList放数据.
最后,老大上线通知一下,整天隐身,鬼才知道你什么有上网.
----------------解决方案--------------------------------------------------------