| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2746 人关注过本帖
标题:千里冰封进 by 万里燎原
只看楼主 加入收藏
万里燎原
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2008-2-26
收藏
 问题点数:0 回复次数:19 
千里冰封进 by 万里燎原
老大,新年好,一听万里燎原就知道我是谁了吧.
帮助一下.
我现在在做ERP,查询的数据量牛大,我用ArrayList<Stk>来装货物资料,而Stk本身就不小,结果超过一定数量
就会内存溢出(out of Memory),帮我看一下有什么类可以代替ArrayList的.(一定是jdk1.5,公司太土没办法)
而且因为原有代码量太大不可能用<<  临时表  >>代替,别一个就是也不能分页,因为要统计汇总.
搜索更多相关主题的帖子: 千里冰封 内存 新年 燎原 ERP 
2008-02-26 15:36
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
收藏
得分:0 
有两个办法
1.分页,统计汇总的时候可以通过数据库查询语句进行统计汇总,没必要放到JAVA中来完成
2.设置JVM参数,像我现在参与的项目,就必须要吧JVM的参数设置为1G,否则跑不动。参数为

-Xmx1024m

淘宝杜琨
2008-02-26 16:44
万里燎原
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2008-2-26
收藏
得分:0 
本来正统思路是这样做的,问题是它的汇总分析不是单纯的加加减减,它是把Stk_mas表的数据取一部分出来,组装成对象
然后再跟之前大量表生成的ArrayList<Object>和HashMap进行比对生成的结果,所谓一动动全身呢,误计要改上百个类,而且一出逻辑错误下面就不用做了.最后调用开元包开生板块图更是难改.至于把内存设大,我很早就知道了,现在我们工程就用调到256-512M内存,其实最根本问题是ArrayList支持不住.我看外国的网站,听说有什么内存数据库,或cache之类的,希望大家帮助解决后下,反正修改的原则只有一个就是拿大容量的向量或类代替ArrayList.
至于分页也是以上的问题,它不是单单的从数据库取东西出来显示.
2008-02-26 17:34
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
收藏
得分:0 
这样,ArrayList实际上是一个数组。你可以考虑换个LinkedList看看,这是链表实现的。

淘宝杜琨
2008-02-26 17:52
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
收藏
得分:0 
另外,在add的时候,最好判断一下返回值,如果是false,那么最好再另外开一个集合类来存储,以避免单个集合类中占用空间过大。

那么大的数据量,莫非是BI,真是夸张,你们领导也不配置个好点的机器,咔咔

淘宝杜琨
2008-02-26 17:59
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
收藏
得分:0 
哈哈,你也来这里了,怎么不QQ呼我呢

可惜不是你,陪我到最后
2008-02-26 21:34
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
收藏
得分:0 
这和大容器是没有关系的,你的内存溢出了是因为你的程序用了很多的内存,并不是ArrayList装不下你的数据,其实JAVA的集合框架来说,ArrayList是列表最好的选择,
你能否只能需要计算的数据.比如Stk类,它里面有哪些数据是不需要参与计算的,你就设计一个小一点的辅助类来装这些数据.这样就可以减小一些内存使用量了.

可惜不是你,陪我到最后
2008-02-26 21:38
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
收藏
得分:0 
不知道你有没有空哦,我上线都不见你,所以都不敢随便打扰你哈。

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

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

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

基于以上理由,我提出用LinkedList代替ArrayList,不直到楼主是否成功了呢?

淘宝杜琨
2008-02-26 22:47
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
收藏
得分:0 
更正一下哦,ArrayList是一次性增长1.5倍,不是2倍,2倍太大了
倍增效应是不得了的

可惜不是你,陪我到最后
2008-02-26 23:09
万里燎原
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2008-2-26
收藏
得分:0 
对老大说: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放数据.
最后,老大上线通知一下,整天隐身,鬼才知道你什么有上网.
2008-02-27 09:16
快速回复:千里冰封进 by 万里燎原
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032349 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved