java线程池 读写10万行文件进行遍历时,占用物理内存溢出

java系统:主线程先读到这3万行数据放到一个list(手机号码、id),然后开启一个线程循环读取另外10个文件,每个文件平均8万行,每读完一个文件将这8万行数据放到一个... java系统:主线程先读到这3万行数据放到一个list(手机号码、id),然后开启一个线程循环读取另外10个文件,每个文件平均8万行,每读完一个文件将这8万行数据放到一个新list(id),然后将这个list跟3万行的list 遍历通过相同的id获取3万行里的手机号码。 发现读到第4个文件时内存溢出,注意不是堆内存溢出。于是我监控系统内存,重新执行时,发现物理内存飙升。接近读到第5个文件时正好物理内存占满,线程被kill掉。但系统没挂。只是这个线程不执行了。但是物理内存等了半个小时还是占满的。 我知道线程是占用物理内存的,linux 每次读写文件的缓存占用内存(buffers cached)为啥不会释放掉,为啥内存一直累加上去,gc是没用的,因为是物理内存。请问有啥办法。 我jvm 堆大小最大最小设置的都是1024M 。

异常:"billChargeExecutor-1" java.lang.OutOfMemoryError: GC overhead limit exceeded
这个异常如何解决,是什么问题,表象上看物理内存被占光了。
百度说jvm gc行为中超过98%以上的时间去释放小于2%的堆空间时会报这个错误。这是啥意思,是GC过于频繁吗,我的jvm设置大小 1024M的,没有手动去回收,怎么解决这个异常呢。
linux总内存就2G。
展开
 我来答
jimmyc2006
2013-07-03 · TA获得超过1153个赞
知道小有建树答主
回答量:572
采纳率:100%
帮助的人:650万
展开全部
先优化下程序吧。你的每个8万行的list,读取完第一个文件,在读取第二个文件的时候释放吗?
你“将这个list跟3万行的list 遍历通过相同的id获取3万行里的手机号码。”这个效率太低了,将3万行数据的list改为HashMap,key是id,value是手机号。
百度网友4b200603
2013-07-02 · TA获得超过193个赞
知道答主
回答量:94
采纳率:100%
帮助的人:47.4万
展开全部
靠....完全看不懂
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
qi_ling2005
2013-07-02 · TA获得超过500个赞
知道小有建树答主
回答量:468
采纳率:0%
帮助的人:275万
展开全部
添加JVM的启动参数来限制使用内存:-XX:-UseGCOverheadLimit 试试
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式