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