开发者社区> 问答> 正文

Java循环读取文件导致内存溢出!?报错

在主函数的循环中,创建一个ReadNodesEdges类对象并处理,当进入下次循环后前一项创建的对象不是应该会被自动GC么。打开GC显示后,老年代内存随着每次循环不断加大,到固定位置后报错——“java.lang.OutOfMemoryError: GC overhead limit exceeded”。

求解应该怎么处理问题??


public class Main_test {
 
    public static void main(String[] args) {
        File[] FileList = new File("D:/Samples/B_func_binary/").listFiles();// 获取目录下所有子目录对象
        for (int i = 0; i < FileList.length; i++) {
            if (FileList[i] != null) {
                System.out.println(FileList[i].getAbsolutePath());// getAbsolutePath()绝对地址
                ReadNodesEdges readNodesEdges = new ReadNodesEdges();
                //问题出现在这个类中
                readNodesEdges.script("D:/Samples/B_gexf/"+ FileList[i].getName().replaceAll("txt", "gexf"));// getName()文件名
            }
        }
    }
 
}
 
class ReadNodesEdges {
   public void script(String path) {
      //Init a project - and therefore a workspace
      ProjectController pc = Lookup.getDefault().lookup(ProjectController.class);
      pc.newProject();
      Workspace workspace = pc.getCurrentWorkspace();
 
      //Get controllers and models
      ImportController importController = Lookup.getDefault().lookup(ImportController.class);
 
      //Import file
      Container container;
      try {
          File file = new File(path);
          container = importController.importFile(file);
          container.getLoader().setEdgeDefault(EdgeDefault.DIRECTED);   //Force DIRECTED
          container.setAllowAutoNode(false);  //Don't create missing nodes
           
      } catch (Exception ex) {
          ex.printStackTrace();
          return;
      }
 
      //这行是关键所在,去掉这行则没有溢出,但是也无法读取数据
      importController.process(container, new DefaultProcessor(), workspace);
  
      GraphModel graphModel = Lookup.getDefault().lookup(GraphController.class).getModel();
      importController = null;
  
       
   }
}





展开
收起
爱吃鱼的程序员 2020-06-09 15:29:39 991 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB
    importController=null;//这之前是不是要释放下importController的资源···



    引用来自“Mr_K”的评论

    importController=null;//这之前是不是要释放下importController的资源···



    我的意思是 importController里面是不是需要手动close或者dispose···

    引用来自“Mr_K”的评论

    我的意思是 importController里面是不是需要手动close或者dispose···

    引用来自“Mr_K”的评论

    我的意思是 importController里面是不是需要手动close或者dispose··· 出现“java.lang.OutOfMemoryError: GC overhead limit exceeded”,一般是因为heap设的太小,把"-Xmx"设大一些应该就可以。

    引用来自“mononite”的评论

    出现“java.lang.OutOfMemoryError: GC overhead limit exceeded”,一般是因为heap设的太小,把"-Xmx"设大一些应该就可以。

    释放container 试试 。。

      

    debug看一下是在第几层循环里面溢出的,找一下具体溢出的原因,因为不了解你的那个包,不晓得里面做了什么操作

    引用来自“Barret_Guo”的评论

    释放container 试试 。。

      

    回复 @Barret_Guo:这个类我用的它自带的demo写的代码,里面并没有什么close之类的方法。。。感觉无解了那么问题应该也只能在这个工具类了。。。
    2020-06-09 15:29:55
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载