You are viewing a plain text version of this content. The canonical link for it is here.
Posted to batik-users@xmlgraphics.apache.org by tomas lin <to...@hotmail.com> on 2003/06/30 22:01:46 UTC

Possible Memory Leak rendering PNG images?

Hi,

There might be a memory leak when rendering embedded images in Batik.

I am working on Windows 2000 SP4  and JDK 1.3.1.

Using CVS Batik from 6/24/03, I start an instance of the JSVGCanvas and set
it to be be dynamic.

I add a node with the following SVG properties:

<image x="0" y="0" width="2700.0" image-rendering="optimizeQuality"
xlink:href="blah.png" height="1813.0" preserveAspectRatio="xMinYMin meet"/>

In this case, blah.png is about 150k. It is a black and white drawing of
size 1813x2700. It has been optimized with the optipng png optimizer.
[ http://www.cs.toronto.edu/~cosmin/pngtech/optipng/ ]

After initial rendering, the app uses ~35 megs.

I do a series of zooms and add more elements. The memory footprint rises to
~100 megs. If I just quit here ( set my SVGCanvas to null ), I see that
memory is never freed.


1. ) I purge the canvas. ( most of this code from Randy Baron's May 5, 2003
post 'JSVGCanvas disposal / memory leak' ).

  public void purge()
    {
        ToolTipManager ttipman = ToolTipManager.sharedInstance();

        ttipman.unregisterComponent(this);
        this.renderer.dispose();
        this.releaseRenderingReferences();
        this.getOverlays().clear();
        this.getInteractors().clear();

        this.bridgeContext.dispose();

        if (this.getUpdateManager() != null &&
this.getUpdateManager().getBridgeContext() != null)
            this.getUpdateManager().getBridgeContext().dispose();

        this.stopProcessing();

        this.getGraphics().dispose();
        this.flushImageCache();
        this.deselectAll();
        this.removeAll();
        this.listener = null;
        this.listenerList = null;
        this.updateManager = null;
        this.accessibleContext = null;
        this.svgDocument = null;
        this.removeMouseListener(mouseListener);

        Runtime.getRuntime().runFinalization();
        Runtime.getRuntime().gc();

        /* in the original code, there  is a nullOut Function, but I want to
retain my SVG's XML,
            so  I do the dispose() call below instead */

    }


2.) After a little tracing, I add a dispose function to
org.apache.batik.gvt.RasterImageNode.

public void dispose{
    this.image = null;        // image in RasterImageNode.java is declared
as protected Filter image;
}

I invoking dispose on the my image node ( blah.png , above )

            ((RasterImageNode)
m_svgCanvas.getUpdateManager().getBridgeContext().getGraphicsNode(m_imageNod
e)).dispose();

m_svgCanvas.getUpdateManager().getBridgeContext().unbind(m_imageNode);

3.) I then add a static function that will invoke flush() on every
BufferedImage object created by PNGRegistryEntry.

At the end of this, I see my memory footprint go down to about 15 megs.



Is there anything else that I can do here to free up more memory?

In particular, there is a 5.5 meg int[] in memory that really bothers me.
This seems to be an Offscreen Image that is referenced by the RepaintManager
(javax.swing.RepaintManager). Is there a way to clear this without disabling
doubleBuffering?

thanks,

-tomas


---------------------------------------------------------------------
To unsubscribe, e-mail: batik-users-unsubscribe@xml.apache.org
For additional commands, e-mail: batik-users-help@xml.apache.org