약 1 또는 2 기가 바이트라고하는 거대한 SOAP 메시지 (멀티 파트, MTOM)를 보내야합니다. 는 때때로 프로세스는 다음 OOM과 끝 :SAAJ의 IBM 구현에 의한 힙 오버플로
내 이해로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 구현에 대한 해결 방법이 있습니까?
청킹이 활성화되어 있지 않고 Content-Length 헤더가 현재까지 존재하므로 동일한 생각을했습니다. 그러나 나는 거기에 덩어리들을 강제하는 방법에 대해 명확한 생각이 없습니다. 요청시 선언 된 프로토콜은 HTTP1.1이므로 오히려 가능해야합니다. – user3714601
청킹을 사용하도록 설정해야하는 제안에 대한 답변을 업데이트했습니다. –
불행히도 아니오, 우리가 그러한 헤더를 직접 설정하려고 시도하면 아무런 효과가 없습니다. 슬픈, 마침내 우리는 SAAJ에서 거대한 메시지를 올바르게 처리하는 JAX-WS로 전환해야했습니다. – user3714601