风暴读取文件抛出" Java.lang.OutOfMemoryError:超出GC开销限制"

时间:2016-12-02 09:39:50

标签: java file garbage-collection apache-storm java-io

我一直在研究Storm拓扑,我从" Execute(tuple)"中的文件中读取。方法和java抛出了一个" Java.lang.OutOfMemoryError:超出GC开销限制"。 该程序正常工作,直到它抛出该错误,因为GarbageCollector的使用太多(我认为)。使用相同的代码一次完美,问题是我的Storm实现的极端同意。 我认为这是因为程序在垃圾收集器上花费了太多时间,以及我编写它的方式,我认为它为同一个文件和Bolt每次执行元组创建了很多读者。我想知道是否可以在" Prepare()"中读取文件。方法,将它保存在String数组中,如果是这样,我问:它是否只为一个Bolt实例创建一个读取器和String数组?

这是我的博尔特的样本:

 public static class FilterSomeBolt extends BaseRichBolt {
       OutputCollector _collector;

        public void prepare(Map conf, TopologyContext context, OutputCollector collector) {
          _collector = collector;
        }

        public void execute(Tuple tuple) {

            String entr = tuple.getString(1);

            boolean flagRet=false;

            try {
                String fileName2 = (String)"file.csv";
                BufferedReader reader2 = new BufferedReader(new FileReader(fileName2));
                // read and ignore the header if one exists

             String line2 =reader2.readLine();
             while(line2!= null){
                    if(line2.toLowerCase().contains("something")&&line2.toLowerCase().contains(entr.substring(1, 8).toLowerCase())){

                        flagRet=true;
                    }//end if
             line2 =reader2.readLine();

        }//end while
}..........................
 ............................//tuple sent

我试图理解这些方法,并希望得到帮助。 提前谢谢!

1 个答案:

答案 0 :(得分:0)

您的文件读取逻辑正在创建问题。如果第一行文件不为null,则while循环将运行无限次。请在代码段后更新它:

while((line2 =reader2.readLine())!= null){
    ....//do anything you want
}

希望这有帮助。