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

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。

先优化下程序吧。你的每个8万行的list,读取完第一个文件,在读取第二个文件的时候释放吗?
你“将这个list跟3万行的list 遍历通过相同的id获取3万行里的手机号码。”这个效率太低了,将3万行数据的list改为HashMap,key是id,value是手机号。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-07-02
靠....完全看不懂
第2个回答  2013-07-02
添加JVM的启动参数来限制使用内存:-XX:-UseGCOverheadLimit 试试