gpt4 book ai didi

java - IBM SAAJ 实现过度使用堆

转载 作者:行者123 更新时间:2023-12-01 09:00:47 26 4
gpt4 key购买 nike

我们需要发送非常巨大的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com