【问题标题】:Why Woodstox takes so much memory?为什么伍德斯托克斯需要这么多内存?
【发布时间】:2015-01-15 15:33:48
【问题描述】:

我正在开发基于 Spring 的服务器端应用程序。我们正在使用 JAXB、SOAP 和 Axiom(包装在 Spring WS 中),它们使用 Woodstox 编组/解组 xml 消息,但是我们的应用程序在垃圾处理方面存在问题。我们只发送 165 Mb 的消息,但 Marshaller 产生了大约 920 Mb 的垃圾。也许有人知道,为什么收集的垃圾这么大,我该如何改善呢?

【问题讨论】:

  • 如果你没有遭受 xml 实体扩展的困扰,我不会称它为垃圾,因为它只有输入的 5.5 倍。根据特定消息,可能会创建很多实例,这些实例具有开销。此外,相同的字符串可能会从 xml 文件的同一部分多次实例化。
  • 最好的办法是做一个堆转储,看看谁是罪魁祸首以及他们是什么类型的对象。
  • 您还应该为您的问题添加更多上下文。这是在客户端还是服务器端?大消息是请求还是响应?您是否使用诸如 JAXB2 之类的数据绑定?等等。

标签: java spring spring-ws axiom woodstox


【解决方案1】:

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

但除此之外,Axiom 提供的数据绑定必须保持更广泛的状态并构建要公开的对象模型。所以我希望它会产生大量的短命物体。它通常还访问 XML 文档的每个值,具体化所有字符串。鉴于此,我同意@SpaceTrucker 的观点,即不需要产生不合理数量的垃圾。与存在于老年代的长寿命对象相比,短期垃圾通常不会有那么大的问题。

您是否尝试过进行堆转储以查看正在生成的对象类型?

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多