Spring批处理不释放内存(内存不足问题)
我有一个spring批量加载,从一个巨大的xml文件(2GB)读取数据,处理数据,并使用hibernate持久化查询将数据写入数据库oracle。我为此使用了100个元素。 问题是,当我在服务器上运行此批处理时,内存分配会增加,直到进程因“内存不足”而被终止(我在服务器上使用了top命令,进程将使用20Gb内存!)。我认为,出于某种原因,spring在结束区块元素后不会释放内存。Spring批处理不释放内存(内存不足问题),spring,spring-batch,Spring,Spring Batch,我有一个spring批量加载,从一个巨大的xml文件(2GB)读取数据,处理数据,并使用hibernate持久化查询将数据写入数据库oracle。我为此使用了100个元素。 问题是,当我在服务器上运行此批处理时,内存分配会增加,直到进程因“内存不足”而被终止(我在服务器上使用了top命令,进程将使用20Gb内存!)。我认为,出于某种原因,spring在结束区块元素后不会释放内存。 你能帮我了解发生了什么事吗 您是否有可能使用JAXB/JAXB2来解组xml数据?如果是这样,问题可能与方法中的JA
你能帮我了解发生了什么事吗 您是否有可能使用
JAXB
/JAXB2
来解组xml数据?如果是这样,问题可能与方法中的JAXBContext
初始化有关,而不是在应用程序中初始化一次。初始化JAXBContext
是一项昂贵的操作,也是内存泄漏的常见原因。可以找到与此问题相关的更多信息。您是否有可能使用JAXB
/JAXB2
来解组xml数据?如果是这样,问题可能与方法中的JAXBContext
初始化有关,而不是在应用程序中初始化一次。初始化JAXBContext
是一项昂贵的操作,也是内存泄漏的常见原因。可以找到与此问题相关的更多信息
您是否有可能使用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);
}
}
public类ClassReader扩展了statxeventitemreader{
公共MyClassReader(t类){
超级();
XStreamMarshaller unmarshaller=新的XStreamMarshaller();
HashMap别名=新HashMap();
别名。put(“记录”,t);
解组器。设置别名(别名);
此.setFragmentRootElementName(“记录”);
这个.setUnmarshaller(unmarshaller);
}
}
我认为这不是问题所在
您是否有可能使用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);
}
}
public类ClassReader扩展了statxeventitemreader{
公共MyClassReader(t类){
超级();
XStreamMarshaller unmarshaller=新的XStreamMarshaller();
HashMap别名=新HashMap();
别名。put(“记录”,t);
解组器。设置别名(别名);
此.setFragmentRootElementName(“记录”);
这个.setUnmarshaller(unmarshaller);
}
}
我认为这不是问题所在。您是否使用
HibernateItemWriter
?如果是,那么您确定clearSession
参数未设置为false吗?请共享您的读写器配置,以便查看内存泄漏可能发生的位置。是否使用HibernateItemWriter
?如果是,那么您确定clearSession
参数未设置为false吗?请共享您的读写器配置,以便查看内存泄漏可能发生的位置。