当前位置: 首页 > 知识库问答 >
问题:

超出Java GC开销限制

卜泓
2023-03-14

我正在尝试预处理一个大的txt文件(10G),并将其存储在二进制文件中以备将来使用。当代码运行时,速度会减慢,并以

异常线程"main"java.lang.OutOfMemoryError: GC开销限制超过

输入文件具有以下结构

200020000000008;0;2
200020000000004;0;2
200020000000002;0;2
200020000000007;1;2

这是我正在使用的代码:

        String strLine;

        FileInputStream fstream = new FileInputStream(args[0]);
        BufferedReader br = new BufferedReader(new InputStreamReader(fstream)); 

        //Read File Line By Line
        HMbicnt map = new HMbicnt("-1");
        ObjectOutputStream  outputStream = null;
        outputStream = new ObjectOutputStream(new FileOutputStream(args[1]));

        int sepIndex = 15;

        int sepIndex2 = 0;
        String str_i = "";
        String bb = "";
        String bbBlock = "init";

        int cnt = 0;
        lineCnt = 0;
        while ((strLine = br.readLine()) != null)   {
            //rozparsovat radek         
            str_i = strLine.substring(0, sepIndex);
            sepIndex2 = strLine.substring(sepIndex+1).indexOf(';');
            bb = strLine.substring(sepIndex+1, sepIndex+1+sepIndex2);
            cnt = Integer.parseInt(strLine.substring(sepIndex+1+sepIndex2+1));
            if(!bb.equals(bbBlock)){
                outputStream.writeObject(map);
                outputStream.flush();
                map = new HMbicnt(bb);
                map.addNew(str_i + ";" + bb, cnt);
                bbBlock = bb;
            }
            else{
                map.addNew(str_i + ";" + bb, cnt);
            }
        }
        outputStream.writeObject(map);

        //Close the input stream
        br.close();
        outputStream.writeObject(map = null);
        outputStream.close();

基本上,它通过in文件并将数据存储到对象HMbicnt(这是一个哈希映射)。一旦在第二列中遇到新值,它应该将对象写入输出文件,释放内存并继续。

感谢任何帮助。

共有2个答案

於英朗
2023-03-14

简单地说,你使用了太多的内存。因为,正如您所说,您的文件是10GB,所以您无法将其全部放入内存中(当然,除非您碰巧有超过10GB的RAM,并且配置了Java来使用它)。

从您的代码和描述中我可以看出,您正在将整个文件读取到内存中,并将其添加到一个巨大的内存映射中,然后将结果写入输出。这是不可行的。您需要重新设计代码以就地工作(即在任何给定时间只将文件的一小部分保留在内存中)。

韩阳云
2023-03-14

我认为问题不是10G在内存中,而是你创建了太多的HashMaps。也许你可以清除HashMap,而不是在你不再需要它之后重新创建它。OutOfMemoryErrorjava.lang.中似乎也出现了类似的问题:超出了GC开销限制,这也是关于HashMaps的

 类似资料:
  • 使用当我尝试构建我的项目时,这种错误越来越多: 错误:任务“:app:CompiledEbugJavaWithJavac”执行失败。OutofMemoryError:超出GC开销限制 有什么办法解决这个问题吗?

  • 问题内容: 我正在尝试建立一个包含2台服务器的Gridgain集群。 使用 GridDataLoader 将.csv文件中的数据(100万至5000万个数据)加载到Gridgain 。 从加载的数据中找到最小值,最大值,平均值等, 当在Eclipse中作为独立应用程序运行时,我得到正确的输出。 但是,在建立集群(eclipse环境中的2个服务器中的2个节点+我的Eclipse环境中的1个节点)的同

  • 问题内容: 我在一个程序中创建了这个错误,该程序创建了几个(数十万)HashMap对象,每个对象都有几个(15-20)文本条目。这些字符串必须全部收集(不分解成较小的数量),然后再提交给数据库。 根据Sun的说法,该错误发生“如果在垃圾回收上花费了太多时间:如果在垃圾回收上花费了总时间的98%以上,而回收不到2%的堆,则将引发OutOfMemoryError。 ”。 显然,可以使用命令行将参数传递

  • 问题内容: 我收到 java.lang.OutOfMemoryError: 在Android 1.4上运行gradle时, 超出了GC开销限制 …这是我的依赖: 如何解决? 问题答案: 将此添加到您的android闭包(构建gradle): 这样可以解决您的问题。不过,如果您遇到问题,请参见以下链接 GC开销限制超出错误

  • 我试图用火花处理10GB的数据,它给了我这个错误, Java语言lang.OutOfMemoryError:超出GC开销限制 笔记本电脑配置为:4CPU,8个逻辑内核,8GB RAM 提交Spark作业时进行Spark配置。 在网上搜索了这个错误后,我有几个问题 如果回答,那将是一个很大的帮助。 1) Spark是内存计算引擎,用于处理10 gb的数据,系统应具有10 gb的RAM。Spark将1

  • 我正在尝试运行一个使用Gatling工具中的提要方法的负载测试。目前,当我们使用一个大小约为3.5GB的文件,其中包含600000条记录时,Gatling失败,例外情况如下:模拟LoadTest模拟开始... 线程“main”java中出现异常。lang.OutOfMemoryError:超过java的GC开销限制。util。数组。java上的copyOf(Arrays.java:2367)。la