Large size data transfer within GWT [ERROR] javax.servlet.ServletContext log: Exception while dispatching incoming RPC call

317 views
Skip to first unread message

OxyGen

unread,
Mar 6, 2012, 11:51:58 AM3/6/12
to Google Web Toolkit
I am working on a GWT based web app for medical image display and
processing. The problem is this kind of medical image do not have the
standarded fomat and it is a huge bytearray (size: over 18M). I have
to directly read the image byte array and send it to the client for
display and further processing. When I transfer a little part of the
image, the client display the pixels normally. But when I transfer the
whole image, the console promotes error:

[ERROR] javax.servlet.ServletContext log: Exception while dispatching
incoming RPC call
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.util.Arrays.copyOf(Unknown Source)
at java.util.ArrayList.ensureCapacity(Unknown Source)
at java.util.ArrayList.add(Unknown Source)
at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.append(ServerSerializationStreamWriter.java:
583)
at
com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeInt(AbstractSerializationStreamWriter.java:
100)
at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter
$VectorWriter$6.write(ServerSerializationStreamWriter.java:233)
at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeArray(ServerSerializationStreamWriter.java:
639)
at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.java:
743)
at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:
621)
at
com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:
126)
at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter
$ValueWriter$8.write(ServerSerializationStreamWriter.java:153)
at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeValue(ServerSerializationStreamWriter.java:
539)
at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeClass(ServerSerializationStreamWriter.java:
709)
at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.java:
748)
at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:
621)
at
com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:
126)
at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter
$ValueWriter$8.write(ServerSerializationStreamWriter.java:153)
at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeValue(ServerSerializationStreamWriter.java:
539)
at com.google.gwt.user.server.rpc.RPC.encodeResponse(RPC.java:616)
at
com.google.gwt.user.server.rpc.RPC.encodeResponseForSuccess(RPC.java:
474)
at
com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:
571)
at
com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:
208)
at
com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:
248)
at
com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:
62)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:
511)
at org.mortbay.jetty.servlet.ServletHandler
$CachedChain.doFilter(ServletHandler.java:1166)
at
com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:
35)
at org.mortbay.jetty.servlet.ServletHandler
$CachedChain.doFilter(ServletHandler.java:1157)
at
com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:
58)

This might be the size limitation of data transfer within GWT, as I've
found other‘s solution like:

encode the byte array by using
com.google.gwt.user.server.Base64Utils.toBase64(byte[]) . But this
method does not work for IE 7. and IE8 has 32kb limit.. IE9 does not
have this limit.

The structure if my project is very simple and clear:

Client side:

-ImageService.java

-ImageServiceAsync.java

-WebImage.java (interface)

-ImageArray.java (store the image data from server)

Server side:

-ImageServiceImpl.java

I used a button to active this image data delivery. In the background,
ImageServiceImpl read a medical image from disk file and send the data
array to client. Now as the limitation that I metioned above, this
process will not be succesful if I sent the whole image data. How can
I do to complete this process succesfully? I wonder if there is a way
to continuously deliver many small parts (<32kb) of data array from
server to client when I just click the button once. So I can divide
the image into many small parts to perform that. Or there are some
other mechanisms useful for this problem.

Jens

unread,
Mar 6, 2012, 1:42:37 PM3/6/12
to google-we...@googlegroups.com
Its a server side OOM exception so you should increase your Java heap space for your application server using -Xmx (max heap size) JVM parameter. Your server JVM just don't have enough memory to build the RPC response.

If you want to display the image you always have the data URI limitations in IE6-8. Because of that most people use a HttpServlet to directly return the image with the correct mime type. That way the browser can directly display the image. Take a look at: https://groups.google.com/d/topic/google-web-toolkit/CWwkYQjQ0q4/discussion

-- J.
Reply all
Reply to author
Forward
0 new messages