Skip to Main Content

Java EE (Java Enterprise Edition) General Discussion

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

memory leak in JAXP?

843834Jul 6 2001 — edited Jul 7 2001
Hi all,

I am trying to develop an application that transforms some huge xml documents. The memory of my DOM objects are not released even those objects are out of scope. Do anyone know why and how to solve this problem?

The following is a simple program I have to show the problem.

Thanks,
// Main program
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class SwingApplication {
    private static String labelPrefix = "JAXP Memory Test Program";

    public Component createComponents(String xmlName) {
        final JLabel label = new JLabel(labelPrefix);

        JButton button = new JButton("I'm a Swing button!");
        button.setMnemonic(KeyEvent.VK_I);
	
	  // Create the object to do transformation
	  xslTestJAXP doJob;
	  if( xmlName != null ) {
	      doJob = new xslTestJAXP(xmlName);
	  } else {
		doJob = new xslTestJAXP();
        }
        button.addActionListener(doJob);
        label.setLabelFor(button);

	  JButton buttonClean = new JButton("Clean up!");
	  buttonClean.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			System.runFinalization();
		      System.gc();
			System.out.println("************ Clean up done!");
		}
	  });

        /*
         * An easy way to put space between a top-level container
         * and its contents is to put the contents in a JPanel
         * that has an "empty" border.
         */
        JPanel pane = new JPanel();
        pane.setBorder(BorderFactory.createEmptyBorder(
                                        30, //top
                                        30, //left
                                        10, //bottom
                                        30) //right
                                        );
        pane.setLayout(new GridLayout(0, 2));
        pane.add(button);
        pane.add(label);
	  pane.add(buttonClean);

        return pane;
    }

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(
                UIManager.getCrossPlatformLookAndFeelClassName());
        } catch (Exception e) { }

        //Create the top-level container and add contents to it.
        JFrame frame = new JFrame("SwingApplication");
        SwingApplication app = new SwingApplication();
	  Component contents;
	  if( args.length > 0 ) {
            contents = app.createComponents(args[0]);
	  } else {
		contents = app.createComponents(null);
	  }
        frame.getContentPane().add(contents, BorderLayout.CENTER);

        //Finish setting up the frame, and show it.
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        frame.pack();
        frame.setVisible(true);
    }
}

// The class do the transformation
// Imported TraX classes
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerConfigurationException;

// Imported java classes
import java.util.Properties;
import java.util.Enumeration;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import org.xml.sax.SAXException;
import org.w3c.dom.*;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class xslTestJAXP implements ActionListener {

    private String xslFile = "test.xsl";
    private String xmlFile = "test.xml";
    
    public xslTestJAXP() {}

    public xslTestJAXP(String xml) {
	  xmlFile = xml;
    }

    public xslTestJAXP(String xml, String xsl) {
	  xmlFile = xml;
	  xslFile = xsl;
    }    

    public void actionPerformed(ActionEvent e) {

	  try {

	      // Read in the xml file and create a dom object
	      Document doc;
	      DocumentBuilder dbuilder;
	      DocumentBuilderFactory dfactory;

	      dfactory = DocumentBuilderFactory.newInstance();
	      //dfactory.setValidating(true);
	      //dfactory.setNamespaceAware(true);
	      dbuilder = dfactory.newDocumentBuilder();
		doc = dbuilder.parse(new File(xmlFile));

		System.out.println("************* Finish building DOM");

	      // Transform the document
	      Transformer transformer;
	      TransformerFactory tFactory;
		DOMResult result;
		Document resultDoc;

	      tFactory = TransformerFactory.newInstance();
	      transformer = tFactory.newTransformer(new StreamSource(xslFile));
		
		result = new DOMResult();
		transformer.transform(new DOMSource(doc), result);
		resultDoc = (Document)result.getNode();

		System.out.println("************* Finish transformation");

	  } catch (SAXException ex) {
		System.out.println("Error: " + ex.toString());
	  } catch (IOException ex) {
		System.out.println("Error: " + ex.toString());
	  } catch (ParserConfigurationException ex) {
		System.out.println("Error: " + ex.toString());
	  } catch (TransformerException ex) {
		System.out.println("Error: " + ex.toString());
	  }
    }
}
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Aug 4 2001
Added on Jul 6 2001
1 comment
357 views