Monday, November 1, 2010

Image Update Memory Leak

Hello,

I have written a simple application which fills a FlexTable with a set
of images. There is a timer which updates the URL of each image every
second. The URL points to a Servlet which in turn generates a random
PNG image on its doGet() method and writes it to the response output
stream. The servlet sets the "Cache-Control" header to "No-Cache".

When I run the webapp in IE7 / 8 the memory gradually increases.
Leaving it overnight can get it close to 1Gb.

Here is the client code:

#################################################################

public class LeakyApp implements EntryPoint
{
public static final String IMAGE_SERVLET_NAME = "imageServlet";

public void onModuleLoad()
{
leak();
}

private void leak()
{
UrlBuilder urlBuilder = createUrlBuilder();

final FlexTable table = new FlexTable();

final List<Image> lstImages = createAndAddImages(5,10 ,table );

final String strURL = urlBuilder.buildString();

final Timer timer = new Timer(){

int nCounter = 0;

@Override
public void run()
{
for (Image img : lstImages)
{
img.setUrl( strURL + "?" + nCounter++) ;
}
}
};

final Button btnStartLeak = new Button("Leak");
btnStartLeak.addClickHandler( new ClickHandler()
{
@Override
public void onClick(ClickEvent event)
{
RootPanel.get().remove( btnStartLeak );
RootPanel.get().add( table );
timer.scheduleRepeating( 1000 );
}
});

RootPanel.get().add( btnStartLeak );
}

private List<Image> createAndAddImages(int rowCount, int colCount,
FlexTable table)
{
List<Image> lstImages = new ArrayList<Image>();

for(int row = 0; row<rowCount; row++)
{
for(int col = 0; col<colCount; col++)
{
Image image = new Image();
lstImages.add( image );
table.setWidget(row, col, image);
}
}

return lstImages;
}

private UrlBuilder createUrlBuilder()
{
UrlBuilder urlBuilder = null;

if( GWT.isScript() )
{
urlBuilder = new UrlBuilder();
urlBuilder.setHost( Window.Location.getHost() );
urlBuilder.setPath( Window.Location.getPath() +
IMAGE_SERVLET_NAME );
}
else
{
urlBuilder = Window.Location.createUrlBuilder();
urlBuilder.setPath( IMAGE_SERVLET_NAME );
}

return urlBuilder;
}
}

############################################################

Here is the servlet code:

############################################################

public class ImageServlet extends HttpServlet
{
private int nCounter = 0;
private Font font = new Font("Tahoma", Font.BOLD, 10);

private static Color getRandomColor()
{
int r = (int)(Math.random()* 255);
int g = (int)(Math.random()* 255);
int b = (int)(Math.random()* 255);

return new Color(r,g,b);
}

@Override
protected void doGet ( HttpServletRequest request,
HttpServletResponse response ) throws IOException
{

OutputStream out = response.getOutputStream();

response.setContentType("image/png");
response.addHeader("Pragma", "no-cache");
response.addHeader("Cache-Control", "no-cache");

ImageIO.write( generateRandomImage(), "png", out );

out.close();
}

private BufferedImage generateRandomImage()
{
return generateRandomImage(80, 80);
}

private BufferedImage generateRandomImage(int width, int height)
{
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_ARGB);

Graphics2D g2d = image.createGraphics();
g2d.setFont( font );
g2d.setColor( getRandomColor() );
g2d.fillRect(0, 0, width, height);
g2d.setColor( Color.WHITE );
g2d.drawString("" + nCounter, 20, 20);

System.err.println(" img " + nCounter );

nCounter++;

if( nCounter == Integer.MAX_VALUE )
nCounter = 0;

return image;
}
}

############################################################

Is there a programming error, or is it the nature of what the
application is doing causing the memory leak? Can anyone explain what
is happening behind the scenes?

Thanks.

--
You received this message because you are subscribed to the Google Groups "Google Web Toolkit" group.
To post to this group, send email to google-web-toolkit@googlegroups.com.
To unsubscribe from this group, send email to google-web-toolkit+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/google-web-toolkit?hl=en.

No comments:

Post a Comment