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