2015-01-15 68 views
0

我正在开发基于服务器端的Spring应用程序。我们正在使用JAXB,SOAP和Axiom(包装在Spring WS中),它们使用Woodstox封送/解组xml消息,但是我们的应用程序在垃圾处理方面存在问题。我们只发送165 Mb信息,但Marshaller生产约920 Mb垃圾。也许有人知道,为什么收集的垃圾的大小如此之大,以及我如何能够改善这种情况?为什么伍德斯托克需要这么多的记忆?

+0

如果你没有受到xml实体扩展的影响,我不会称它为垃圾,因为它只是输入的5.5倍。根据特定的消息,可能会有很多创建的实例会导致开销。另外,相同的字符串可能会从xml文件的相同部分多次实例化。 – SpaceTrucker 2015-01-15 15:59:29

+0

最好的办法是做一个堆转储,看看谁是罪魁祸首,他们是什么类型的对象。 – LudgerP 2015-01-16 06:05:35

+0

您还应该为您的问题添加更多上下文。这是在客户端还是服务器端?大消息是请求还是响应?你使用数据绑定,如JAXB2?等等。 – 2015-01-16 20:42:35

回答

0

Woodstox本身并不真正产生所有垃圾,因为它只保留一小组状态以支持流式访问。生成的主要对象只是生成的字符串值,甚至只在访问时才生成。

但是,由Axiom提供的数据绑定必须保持更广泛的状态并构建要公开的对象模型。所以我期望它会产生很多短命的对象。它通常也会访问XML文档的每个值,实现所有字符串。鉴于此,我同意@SpaceTrucker认为这没有必要产生不合理的垃圾量。与生活在老一代的长寿命物体相比,短期垃圾并不常见。

您是否尝试过使用堆转储来查看正在生成什么类型​​的对象?