java - IBM SAAJ 实现过度使用堆

标签 java soap heap-memory saaj

我们需要发送非常巨大的 SOAP 消息(多部分、MTOM),比如大约 1 或 2 GB。 有时该过程会出现以下 OOM:

java.lang.OutOfMemoryError: Java Heap Space
at java.util.Arrays.copyOf(Arrays.java:2479)
at java.io.ByteArrayOutputStream.toByteArray(ByteArrayOutputStream.java:203)
at com.ibm.ws.webservices.engine.transport.channel.OutboundOutputStream.toByteArray(OutboundOutputStream.java:100)
at com.ibm.ws.webservices.engine.transport.http.HttpOutboundChannelConnection.prepareHttpRequestHeaders(HttpOutboundChannelConnection.java:2027)
at com.ibm.ws.webservices.engine.transport.http.HttpOutboundChannelConnection.sendSOAPRequest(HttpOutboundChannelConnection.java:374)
at com.ibm.ws.webservices.engine.transport.http.HTTPSender.invoke(HTTPSender.java:745)
at com.ibm.ws.webservices.engine.PivotHandlerWrapper.invoke(PivotHandlerWrapper.java:264)
at com.ibm.ws.webservices.engine.PivotHandlerWrapper.invoke(PivotHandlerWrapper.java:264)
at com.ibm.ws.webservices.engine.WebServicesEngine.invoke(WebServicesEngine.java:336)
at com.ibm.ws.webservices.engine.client.Connection.invokeEngine(Connection.java:970)
at com.ibm.ws.webservices.engine.client.Connection.invoke(Connection.java:761)
at com.ibm.ws.webservices.engine.soap.SOAPConnectionImpl.call(SOAPConnectionImpl.java:223)
at com.ibm.ws.webservices.engine.soap.SOAPConnectionImpl.call(SOAPConnectionImpl.java:163)

据我了解,问题是由于使用 ByteArrayOutputStream 造成的,在处理非常大的流时,它看起来不合适。

在堆栈跟踪之后,它需要堆中至少有 2 个整个消息内容的副本(作为字节数组)。

所以问题是,有谁知道通过堆消耗更好地实现 SAAJ 吗? 或者可能是 SAAJ 的 IBM 实现的一些解决方法?

最佳答案

假设 IBM 的 SAAJ 实现并非完全无脑,我希望它仅在未启用 HTTP 分块的情况下将消息转换为字节数组,并且需要在发送消息之前计算消息的长度。因此,首先要做的是确保启用分块。

我不认为 SAAJ 定义了启用分块的标准方法,但您可能想尝试在消息上设置相应的 HTTP header :

soapMessage.getMimeHeaders().addHeader("Transfer-Encoding", "chunked");

SAAJ 实现很可能会遵守这一点。

关于java - IBM SAAJ 实现过度使用堆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41694877/

相关文章:

java - 使用 Map 值调用 Java 方法

java - Android:如何知道运行时小部件应用了哪种样式

tomcat - Windows 更新后 JVM 内存初始化错误

android - 为什么应用程序随机死亡?

c - 给定一个指针,找到它所在的堆 block

java - jgoodies 绑定(bind) + 间接更改

java - java libgdx android 中的 float 问题

java - WS 库 : com. sun.xml 与 javax.xml

Java设计: Decouple JNI Library

xml - 在我的应用程序中用 JAXB 替换 XStream