【发布时间】:2010-12-27 01:47:30
【问题描述】:
我们使用 XStream 对 XML 进行序列化/反序列化...并且刚刚得到一个 OutOfMemory 异常。
首先,我不明白为什么会出现错误,因为我们有 500MB 分配给服务器。
问题是 - 我们应该做出哪些改变来避免麻烦?我们希望确保这种实施规模化。
目前我们有大约 60K 个对象,每个对象大约 50 个字节。我们将 60K POJO 加载到内存中,并将它们序列化为一个字符串,我们使用 HttpClient 将其发送到 Web 服务。接收时,我们得到整个String,然后转换成POJO。 XML/对象层次结构如下:
<root>
<meta>
<date>10/10/2009</date>
<type>abc</type>
</meta>
<data>
<field>x</field>
</data>
[thousands of <data>]
</root>
我认为最好的方法是不将 POJO 存储在内存中,不将内容写入单个字符串。相反,我们应该将单个 <data> POJO 写入流。 XStream supports this 但似乎不支持 <meta> 元素。数据需要采用以下形式:
<root>
<data>
<field>x</field>
</data>
[thousands of <data>]
</root>
那么什么方法最容易流式传输整个树?
【问题讨论】:
-
你怎么知道每个对象是50字节?
-
只是一个近似值。有五个字段,每个字段包含大约 10 个字节的数据..
-
我指的只是数据。我不知道 Java 使用多少内存来存储对象本身。我还没有使用分析器..
-
您链接到的页面提供了编写流序列化所需的代码的问题在哪里。我唯一不明白的是你的意思是
<meta>将不被支持。这是什么意思。 -
我相信 XStream 只支持序列化同一类的对象集合。所以你不能序列化
data类对象和meta类对象。
标签: java xml web-services stream xstream