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

Spring批处理不释放内存(内存不足问题),spring,spring-batch,Spring,Spring Batch,我有一个spring批量加载,从一个巨大的xml文件(2GB)读取数据,处理数据,并使用hibernate持久化查询将数据写入数据库oracle。我为此使用了100个元素。 问题是,当我在服务器上运行此批处理时,内存分配会增加,直到进程因“内存不足”而被终止(我在服务器上使用了top命令,进程将使用20Gb内存!)。我认为,出于某种原因,spring在结束区块元素后不会释放内存。 你能帮我了解发生了什么事吗 您是否有可能使用JAXB/JAXB2来解组xml数据?如果是这样,问题可能与方法中的JA

我有一个spring批量加载,从一个巨大的xml文件(2GB)读取数据,处理数据,并使用hibernate持久化查询将数据写入数据库oracle。我为此使用了100个元素。 问题是,当我在服务器上运行此批处理时,内存分配会增加,直到进程因“内存不足”而被终止(我在服务器上使用了top命令,进程将使用20Gb内存!)。我认为,出于某种原因,spring在结束区块元素后不会释放内存。
你能帮我了解发生了什么事吗

您是否有可能使用
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吗?请共享您的读写器配置,以便查看内存泄漏可能发生的位置。