The loop in ClientProducerImpl seems to be responsible:
while (!lastChunk)
| {
| byte[] bytesRead = new byte[minLargeMessageSize];
| int numberOfBytesRead;
|
| try
| {
| numberOfBytesRead = input.read(bytesRead);
| }
| catch (IOException e)
| {
| throw new
MessagingException(MessagingException.LARGE_MESSAGE_ERROR_BODY,
| "Error reading the
LargeMessageBody",
| e);
| }
|
| if (numberOfBytesRead < 0)
| {
| numberOfBytesRead = 0;
| lastChunk = true;
| }
|
| final SessionSendContinuationMessage chunk = new
SessionSendContinuationMessage(bytesRead,
|
numberOfBytesRead,
|
!lastChunk,
|
lastChunk && sendBlocking);
|
| if (sendBlocking && lastChunk)
| {
| // When sending it blocking, only the last chunk will be blocking.
| channel.sendBlocking(chunk);
| }
| else
| {
| channel.send(chunk);
| }
| }
|
By configuring my connection factory I have minLargeMessageSize=131072 (128K)
My input stream is a buffered input stream returning 1024 bytes at a time.
The stream source is 512K in length.
Therefore, each time around the loop I will create a new 128K byte[] with 1K of data read
into it. I then pass a reference to the array to new SessionSendContinuationMessage.
With 512 loop interations required to read and send the stream content I consume 64M of
heap space in byte arrays.
wdyt?
View the original post :
http://www.jboss.org/index.html?module=bb&op=viewtopic&p=4250830#...
Reply to the post :
http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&a...