Java垃圾收集器在加载本体文件时无法清理内存

时间:2017-09-11 21:39:59

标签: java garbage-collection

每次我尝试加载和处理一堆 .owl 文件时,我的应用程序中都会遇到 java.lang.OutOfMemoryError 的问题。我在目录中有500个奇怪的.owl文件,我使用loadOntologyFromOntologyDocument()循环内的for OWL API方法将它们逐个加载到内存中。但是,在该方法加载一些本体后,内存开始耗尽。垃圾收集器不会清除未使用的对象引用。我搜索了问题并使用 -Xmx 将堆大小增加到5GB,这是许多人所建议的。但问题仍然存在。我感谢你在这方面的任何帮助。

OWLOntologyManager owlManager = OWLManager.createOWLOntologyManager(); 
File folder = new File("G:\\OWL and OBO");
File[] listOfFiles = folder.listFiles();
for (int i = 0; i < listOfFiles.length; i++) {
    if (listOfFiles[i].isFile()) {
        System.out.println("File " + listOfFiles[i].getName());
        try{
            File sourceFile = new File( "G:\\OWL and OBO\\" + listOfFiles[i].getName());
            OWLOntology ontology = owlManager.loadOntologyFromOntologyDocument(sourceFile);
        } catch(Exception e){
            e.printStackTrace();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

OWLOntologyManager似乎可能会挂在文件之间的某些内存中。你有没有尝试在listOfFiles循环中移动第一行?为每个文件创建一个新实例会“更加昂贵”,但这比“破坏”要好。

File folder = new File("G:\\OWL and OBO");
File[] listOfFiles = folder.listFiles();
for (int i = 0; i < listOfFiles.length; i++) {
    if (listOfFiles[i].isFile()) {
        OWLOntologyManager owlManager = OWLManager.createOWLOntologyManager(); 
        System.out.println("File " + listOfFiles[i].getName());
        try{
            File sourceFile = new File( "G:\\OWL and OBO\\" + listOfFiles[i].getName());
            OWLOntology ontology = owlManager.loadOntologyFromOntologyDocument(sourceFile);
        } catch(Exception e){
            e.printStackTrace();
        }
    }
}