Groovy JAXB解组器内存消耗

Groovy JAXB解组器内存消耗,groovy,gradle,jaxb,unmarshalling,Groovy,Gradle,Jaxb,Unmarshalling,我已经通过“xjc”命令从XSD创建了几个类,现在我正在通过Gradle/Groovy中的XMLStreamReader和JAXB(它逐块读取)来解组一个大型XML文件: def getMemory(){ long used = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); return used / (1024*1024) } def xmlUnMars

我已经通过“xjc”命令从XSD创建了几个类,现在我正在通过Gradle/Groovy中的XMLStreamReader和JAXB(它逐块读取)来解组一个大型XML文件:

def getMemory(){
        long used  = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
        return used / (1024*1024)
    }

def xmlUnMarshaller(FileReader fileReader) {
        System.out.println("Memory Before:${getMemory()}")

        XMLInputFactory xif = XMLInputFactory.newFactory()
        XMLStreamReader xsr = xif.createXMLStreamReader(fileReader);
        def jContext = (JAXBContext) JAXBContext.newInstance(Patient.class)
        Unmarshaller unmarshaller = jContext.createUnmarshaller()
        def patientCount = 0
        while (xsr.hasNext()) {
            if (xsr.isStartElement() && xsr.getLocalName().equals("patient")) {
                def patient = (Subject) unmarshaller.unmarshal(xsr)
                patientCount++
            } else {
                xsr.next()
            }
        }
        xsr.close()

        System.out.println("Memory After:${getMemory()}")
    }
在“jaxb.properties”文件中,我提到:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
它工作正常但占用大量内存!这是运行jar文件后的内存状态:

Memory Before:19.5550079345703125
Memory After :98.85445404052734375
我已经使用Gradle构建了jar文件。令人惊讶的是,如果我在Intellij中调试相同的代码,它会显示不同的内存使用情况(我想这是合理的):

以下是我在build.gralde上使用的依赖项:

dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.3.1'
    compile 'org.eclipse.persistence:org.eclipse.persistence.moxy:2.6.1'
    jaxb 'com.sun.xml.bind:jaxb-xjc:2.2.7-b41'
    jaxb 'com.sun.xml.bind:jaxb-impl:2.2.7-b41'
    jaxb 'javax.xml.bind:jaxb-api:2.2.7'
}

为什么会这样?为什么它在运行jar文件时会占用这么多内存?

内存是否已用完?如果我继续解组其他文件(因为我需要加载和解组更多),它会逐渐使用越来越多的内存,并达到使用1.5G内存的程度!但是没有关于“内存不足”的任何异常。听起来它工作得很好,谢谢Tim,但是为什么它使用了这么多内存呢?它不释放它使用的内存吗?如果我继续加载更多的XML,我可以看到内存使用率会增加,并且不会释放内存。就我所知,是否应该返回内存,否则我猜某个地方有内存泄漏。它最终是否会耗尽内存?是否会耗尽内存?如果我继续对其他文件进行解组(因为我需要加载和解组更多),它会逐渐使用越来越多的内存,并达到使用1.5G内存的程度!但是没有关于“内存不足”的任何异常。听起来它工作得很好,谢谢Tim,但是为什么它使用了这么多内存呢?它不释放它使用的内存吗?如果我继续加载更多的XML,我可以看到内存使用率会增加,并且不会释放内存。就我所知,我是否应该返回内存,否则我猜某个地方有内存泄漏。它最终会耗尽内存吗?
dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.3.1'
    compile 'org.eclipse.persistence:org.eclipse.persistence.moxy:2.6.1'
    jaxb 'com.sun.xml.bind:jaxb-xjc:2.2.7-b41'
    jaxb 'com.sun.xml.bind:jaxb-impl:2.2.7-b41'
    jaxb 'javax.xml.bind:jaxb-api:2.2.7'
}