我在使用XStream获取OutOfMemoryError,同时将Java转换为XML并写入文件。它发生在xstream.toXMl操作中。我能够在文件中写入大约200 MB的文件,并在控制台中显示700 MB的堆使用等等。但之后,我收到错误并且处理停止。
我正在使用XStream版本1.4.7和Java 1.7。
以下是代码:
final File xmlFile =
new File(System.getProperty("user.dir") + "\\" + "Test.xml");
final Writer out =
new BufferedWriter(new OutputStreamWriter(new FileOutputStream(xmlFile),
"UTF-8"));
try {
final Map values = data from gemfire cache
xstream.toXML(values, out);
// final ObjectOutputStream outStream = xstream.createObjectOutputStream(out);
// outStream.writeObject(values);
} finally {
out.close();
}
我尝试执行以下操作以消除错误但无法正常工作。
1)。我尝试添加XPP3(来自org.ogce)1.1.6和XMLPULL(来自xmlpull)1.1.3.4a maven依赖项
2)。是final XStream xstream = new XStream(new StaxDriver());
3)。将eclipse.ini中的xms和xmx更改为1024m。这就是我的eclipse.ini的样子
-startup
plugins/org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.200.v20130807-1835
-vm
C:/Program Files/Java/jdk1.7.0_51/bin/javaw.exe
-product
org.eclipse.epp.package.standard.product
--launcher.defaultAction
openFile
--launcher.XXMaxPermSize
1024M
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
1024m
--launcher.defaultAction
openFile
--launcher.appendVmargs
-vmargs
-Dosgi.requiredJavaVersion=1.6
-Xms1024m
-Xmx1024m
-Dorg.eclipse.swt.browser.IEVersion=10001
-Dsubversion.native.library=C:/Program Files/SlikSvn/bin/libsvnjavahl-1.dll
4)。尝试使用ObjectStream,您可以在上面的代码中看到注释
5)。添加了运行时参数Xms1024m -Xss256k -Dinsight.enabled=false -XX:PermSize=512M -XX:MaxPermSize=512m
6)。添加了运行时参数- -XX:+UseConcMarkSweepGC
请告知..
答案 0 :(得分:0)
当我将Java对象序列化为Xml时,我也意识到了这个问题。这里的根本原因是:您的java对象可能包含实例变量,它是共享变量,如单吨对象等。 对于这样的实例变量,你需要初始化变量这样一种方式,它将使用不使用单吨对象。您可以在类中创建新对象并分配给您的实例变量,因此在序列化此类实例变量时,它不会产生任何问题。
我已经解决了以前遇到同样错误的问题。
如果您需要进一步的帮助,请与我们联系。