Spring批处理不释放内存(内存不足问题)

时间:2019-05-18 08:10:15

标签: spring spring-batch

我有一个春季批处理的大规模加载,它从一个巨大的xml文件(2GB)中读取,处理并通过休眠持久查询写入DB oracle。我为此使用了100个元素的块。 问题是,当我在服务器上运行此批处理时,内存分配增加,直到该进程因“内存不足”而被杀死(我在服务器上使用了top命令,并且该进程开始使用20Gb内存!)..我认为,对于出于某种原因,在结束块元素之后,spring不会释放内存。 您能帮我了解发生了什么吗?

2 个答案:

答案 0 :(得分:0)

您是否有机会使用JAXB / JAXB2解组xml数据?如果是这样,则问题可能与方法中JAXBContext的初始化有关,而不是与应用程序中的初始化有关。初始化JAXBContext是昂贵的操作,也是导致内存泄漏的常见原因。与该问题有关的更多信息,请参见here

答案 1 :(得分:0)

  

您是否正使用JAXB / JAXB2解组xml数据?如果是这样,则问题可能与您的方法中JAXBContext的初始化有关,而不是与在您的应用程序中对其进行一次初始化有关。初始化JAXBContext是一项昂贵的操作,并且是导致内存泄漏的常见原因。有关此问题的更多信息,请参见此处。

我正在按以下方式使用Stax:

public class ClassReader<T> extends StaxEventItemReader<T> {

    public MyClassReader(Class<T> t) {
        super();
        XStreamMarshaller unmarshaller = new XStreamMarshaller();

        HashMap<String, Object> aliases = new HashMap<String, Object>();
        aliases.put("RECORD", t);
        unmarshaller.setAliases(aliases);

        this.setFragmentRootElementName("RECORD");

        this.setUnmarshaller(unmarshaller);
    }
}

我不认为这是问题所在。