Revision: 1171
Author: heuermh
Date: Fri Aug 31 10:07:38 2012
Log: Issue 186 ; moving PSwingMemoryLeakExample to
examples.pswing.issues package, commit 1 of 2
http://code.google.com/p/piccolo2d/source/detail?r=1171
Added:
/piccolo2d.java/trunk/examples/src/main/java/org/piccolo2d/examples/pswing/issues/PSwingMemoryLeakExample.java
Deleted:
/piccolo2d.java/trunk/examples/src/main/java/org/piccolo2d/examples/pswing/PSwingMemoryLeakExample.java
=======================================
--- /dev/null
+++
/piccolo2d.java/trunk/examples/src/main/java/org/piccolo2d/examples/pswing/issues/PSwingMemoryLeakExample.java
Fri Aug 31 10:07:38 2012
@@ -0,0 +1,261 @@
+/*
+ * Copyright (c) 2008-2011, Piccolo2D project, http://piccolo2d.org
+ * Copyright (c) 1998-2008, University of Maryland
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
this list of conditions
+ * and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright
notice, this list of conditions
+ * and the following disclaimer in the documentation and/or other
materials provided with the
+ * distribution.
+ *
+ * None of the name of the University of Maryland, the name of the
Piccolo2D project, or the names of its
+ * contributors may be used to endorse or promote products derived from
this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.piccolo2d.examples.pswing;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.SwingUtilities;
+import javax.swing.Timer;
+
+import org.piccolo2d.PCanvas;
+import org.piccolo2d.extras.pswing.PSwing;
+import org.piccolo2d.extras.pswing.PSwingCanvas;
+import org.piccolo2d.nodes.PText;
+
+
+/**
+ * Attempt to replicate the PSwingRepaintManager-related memory leak
reported in
+ * Issue 74.
+ */
+public final class PSwingMemoryLeakExample extends JFrame {
+
+ /** Default serial version UID. */
+ private static final long serialVersionUID = 1L;
+
+ /** Active instances. */
+ private final PText active;
+
+ /** Finalized instances. */
+ private final PText finalized;
+
+ /** Free memory. */
+ private final PText freeMemory;
+
+ /** Total memory. */
+ private final PText totalMemory;
+
+ /** Used memory. */
+ private final PText usedMemory;
+
+ /** Canvas. */
+ private final PCanvas canvas;
+
+ /** Main panel, container for PSwingCanvases. */
+ private final JPanel mainPanel;
+
+ /**
+ * Create a new PSwing memory leak example.
+ */
+ public PSwingMemoryLeakExample() {
+ super("PSwing memory leak example");
+
+ final PText label0 = new PText("Number of active PSwingCanvases:");
+ active = new PText("0");
+ final PText label4 = new PText("Number of finalized
PSwingCanvases:");
+ finalized = new PText("0");
+ final PText label1 = new PText("Total memory:");
+ totalMemory = new PText("0");
+ final PText label2 = new PText("Free memory:");
+ freeMemory = new PText("0");
+ final PText label3 = new PText("Used memory:");
+ usedMemory = new PText("0");
+
+ label0.offset(20.0d, 20.0d);
+ active.offset(label0.getFullBounds().getWidth() + 50.0d, 20.0d);
+ label4.offset(20.0d, 40.0d);
+ finalized.offset(label4.getFullBounds().getWidth() + 50.0d, 40.0d);
+ label1.offset(20.0d, 60.0d);
+ totalMemory.offset(label1.getFullBounds().getWidth() + 40.0d,
60.0d);
+ label2.offset(20.0d, 80.0d);
+ freeMemory.offset(label2.getFullBounds().getWidth() + 40.0d,
80.0d);
+ label3.offset(freeMemory.getFullBounds().getX() + 80.0d, 80.0d);
+ usedMemory.offset(label3.getFullBounds().getX() +
label3.getFullBounds().getWidth() + 20.0d, 80.0d);
+
+ canvas = new PCanvas();
+ canvas.getCamera().addChild(label0);
+ canvas.getCamera().addChild(active);
+ canvas.getCamera().addChild(label4);
+ canvas.getCamera().addChild(finalized);
+ canvas.getCamera().addChild(label1);
+ canvas.getCamera().addChild(totalMemory);
+ canvas.getCamera().addChild(label2);
+ canvas.getCamera().addChild(freeMemory);
+ canvas.getCamera().addChild(label3);
+ canvas.getCamera().addChild(usedMemory);
+ canvas.setPreferredSize(new Dimension(400, 110));
+
+ mainPanel = new JPanel();
+ mainPanel.setPreferredSize(new Dimension(400, 290));
+ mainPanel.setLayout(new FlowLayout());
+
+ getContentPane().setLayout(new BorderLayout());
+ getContentPane().add("North", canvas);
+ getContentPane().add("Center", mainPanel);
+
+ final Timer add = new Timer(10, new ActionListener() {
+ int id = 0;
+
+ /** {@inheritDoc} */
+ public void actionPerformed(final ActionEvent e) {
+ final JLabel label = new JLabel("Label" + id);
+ final PSwing pswing = new PSwing(label);
+ final PSwingCanvas pswingCanvas = new PSwingCanvas() {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /** {@inheritDoc} */
+ public void finalize() {
+ incrementFinalized();
+ }
+ };
+ pswingCanvas.getLayer().addChild(pswing);
+ pswingCanvas.setPreferredSize(new Dimension(60, 18));
+ mainPanel.add(pswingCanvas);
+ mainPanel.invalidate();
+ mainPanel.validate();
+ mainPanel.repaint();
+
+ id++;
+ incrementActive();
+ }
+ });
+ add.setDelay(5);
+ add.setRepeats(true);
+
+ final Timer remove = new Timer(20000, new ActionListener() {
+ /** {@inheritDoc} */
+ public void actionPerformed(final ActionEvent e) {
+ if (add.isRunning()) {
+ add.stop();
+ }
+ final int i = mainPanel.getComponentCount() - 1;
+ if (i > 0) {
+ mainPanel.remove(mainPanel.getComponentCount() - 1);
+ mainPanel.invalidate();
+ mainPanel.validate();
+ mainPanel.repaint();
+ decrementActive();
+ }
+ }
+ });
+ remove.setDelay(5);
+ remove.setRepeats(true);
+
+ final Timer updateMemory = new Timer(500, new ActionListener() {
+ /** {@inheritDoc} */
+ public void actionPerformed(final ActionEvent e) {
+ updateMemory();
+ }
+ });
+ updateMemory.setDelay(2000);
+ updateMemory.setRepeats(true);
+
+ add.start();
+ remove.start();
+ updateMemory.start();
+
+ setDefaultCloseOperation(EXIT_ON_CLOSE);
+ setBounds(100, 100, 400, 400);
+ setVisible(true);
+ }
+
+ /**
+ * Increment active.
+ */
+ private void incrementActive() {
+ int count = Integer.parseInt(active.getText());
+ count++;
+ active.setText(String.valueOf(count));
+ canvas.repaint();
+ }
+
+ /**
+ * Decrement active.
+ */
+ private void decrementActive() {
+ int count = Integer.parseInt(active.getText());
+ count--;
+ active.setText(String.valueOf(count));
+ canvas.repaint();
+ }
+
+ /**
+ * Increment finalized.
+ */
+ private void incrementFinalized() {
+ int count = Integer.parseInt(finalized.getText());
+ count++;
+ finalized.setText(String.valueOf(count));
+ canvas.repaint();
+ }
+
+ /**
+ * Update memory.
+ */
+ private void updateMemory() {
+ new Thread(new Runnable() {
+ /** {@inheritDoc} */
+ public void run() {
+ System.gc();
+ System.runFinalization();
+ }
+ }).run();
+
+ final long total = Runtime.getRuntime().totalMemory();
+ totalMemory.setText(String.valueOf(total));
+ final long free = Runtime.getRuntime().freeMemory();
+ freeMemory.setText(String.valueOf(free));
+ final long used = total - free;
+ usedMemory.setText(String.valueOf(used));
+ canvas.repaint();
+ }
+
+ /**
+ * Main.
+ *
+ * @param args command line arguments, ignored
+ */
+ public static void main(final String[] args) {
+ SwingUtilities.invokeLater(new Runnable() {
+ /** {@inheritDoc} */
+ public void run() {
+ new PSwingMemoryLeakExample();
+ }
+ });
+ }
+}
=======================================
---
/piccolo2d.java/trunk/examples/src/main/java/org/piccolo2d/examples/pswing/PSwingMemoryLeakExample.java
Tue Mar 15 15:23:53 2011
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Copyright (c) 2008-2011, Piccolo2D project, http://piccolo2d.org
- * Copyright (c) 1998-2008, University of Maryland
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
modification, are permitted provided
- * that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice,
this list of conditions
- * and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright
notice, this list of conditions
- * and the following disclaimer in the documentation and/or other
materials provided with the
- * distribution.
- *
- * None of the name of the University of Maryland, the name of the
Piccolo2D project, or the names of its
- * contributors may be used to endorse or promote products derived from
this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A
- * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR
- * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package org.piccolo2d.examples.pswing;
-
-import java.awt.BorderLayout;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.SwingUtilities;
-import javax.swing.Timer;
-
-import org.piccolo2d.PCanvas;
-import org.piccolo2d.extras.pswing.PSwing;
-import org.piccolo2d.extras.pswing.PSwingCanvas;
-import org.piccolo2d.nodes.PText;
-
-
-/**
- * Attempt to replicate the PSwingRepaintManager-related memory leak
reported in
- * Issue 74.
- */
-public final class PSwingMemoryLeakExample extends JFrame {
-
- /** Default serial version UID. */
- private static final long serialVersionUID = 1L;
-
- /** Active instances. */
- private final PText active;
-
- /** Finalized instances. */
- private final PText finalized;
-
- /** Free memory. */
- private final PText freeMemory;
-
- /** Total memory. */
- private final PText totalMemory;
-
- /** Used memory. */
- private final PText usedMemory;
-
- /** Canvas. */
- private final PCanvas canvas;
-
- /** Main panel, container for PSwingCanvases. */
- private final JPanel mainPanel;
-
- /**
- * Create a new PSwing memory leak example.
- */
- public PSwingMemoryLeakExample() {
- super("PSwing memory leak example");
-
- final PText label0 = new PText("Number of active PSwingCanvases:");
- active = new PText("0");
- final PText label4 = new PText("Number of finalized
PSwingCanvases:");
- finalized = new PText("0");
- final PText label1 = new PText("Total memory:");
- totalMemory = new PText("0");
- final PText label2 = new PText("Free memory:");
- freeMemory = new PText("0");
- final PText label3 = new PText("Used memory:");
- usedMemory = new PText("0");
-
- label0.offset(20.0d, 20.0d);
- active.offset(label0.getFullBounds().getWidth() + 50.0d, 20.0d);
- label4.offset(20.0d, 40.0d);
- finalized.offset(label4.getFullBounds().getWidth() + 50.0d, 40.0d);
- label1.offset(20.0d, 60.0d);
- totalMemory.offset(label1.getFullBounds().getWidth() + 40.0d,
60.0d);
- label2.offset(20.0d, 80.0d);
- freeMemory.offset(label2.getFullBounds().getWidth() + 40.0d,
80.0d);
- label3.offset(freeMemory.getFullBounds().getX() + 80.0d, 80.0d);
- usedMemory.offset(label3.getFullBounds().getX() +
label3.getFullBounds().getWidth() + 20.0d, 80.0d);
-
- canvas = new PCanvas();
- canvas.getCamera().addChild(label0);
- canvas.getCamera().addChild(active);
- canvas.getCamera().addChild(label4);
- canvas.getCamera().addChild(finalized);
- canvas.getCamera().addChild(label1);
- canvas.getCamera().addChild(totalMemory);
- canvas.getCamera().addChild(label2);
- canvas.getCamera().addChild(freeMemory);
- canvas.getCamera().addChild(label3);
- canvas.getCamera().addChild(usedMemory);
- canvas.setPreferredSize(new Dimension(400, 110));
-
- mainPanel = new JPanel();
- mainPanel.setPreferredSize(new Dimension(400, 290));
- mainPanel.setLayout(new FlowLayout());
-
- getContentPane().setLayout(new BorderLayout());
- getContentPane().add("North", canvas);
- getContentPane().add("Center", mainPanel);
-
- final Timer add = new Timer(10, new ActionListener() {
- int id = 0;
-
- /** {@inheritDoc} */
- public void actionPerformed(final ActionEvent e) {
- final JLabel label = new JLabel("Label" + id);
- final PSwing pswing = new PSwing(label);
- final PSwingCanvas pswingCanvas = new PSwingCanvas() {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- /** {@inheritDoc} */
- public void finalize() {
- incrementFinalized();
- }
- };
- pswingCanvas.getLayer().addChild(pswing);
- pswingCanvas.setPreferredSize(new Dimension(60, 18));
- mainPanel.add(pswingCanvas);
- mainPanel.invalidate();
- mainPanel.validate();
- mainPanel.repaint();
-
- id++;
- incrementActive();
- }
- });
- add.setDelay(5);
- add.setRepeats(true);
-
- final Timer remove = new Timer(20000, new ActionListener() {
- /** {@inheritDoc} */
- public void actionPerformed(final ActionEvent e) {
- if (add.isRunning()) {
- add.stop();
- }
- final int i = mainPanel.getComponentCount() - 1;
- if (i > 0) {
- mainPanel.remove(mainPanel.getComponentCount() - 1);
- mainPanel.invalidate();
- mainPanel.validate();
- mainPanel.repaint();
- decrementActive();
- }
- }
- });
- remove.setDelay(5);
- remove.setRepeats(true);
-
- final Timer updateMemory = new Timer(500, new ActionListener() {
- /** {@inheritDoc} */
- public void actionPerformed(final ActionEvent e) {
- updateMemory();
- }
- });
- updateMemory.setDelay(2000);
- updateMemory.setRepeats(true);
-
- add.start();
- remove.start();
- updateMemory.start();
-
- setDefaultCloseOperation(EXIT_ON_CLOSE);
- setBounds(100, 100, 400, 400);
- setVisible(true);
- }
-
- /**
- * Increment active.
- */
- private void incrementActive() {
- int count = Integer.parseInt(active.getText());
- count++;
- active.setText(String.valueOf(count));
- canvas.repaint();
- }
-
- /**
- * Decrement active.
- */
- private void decrementActive() {
- int count = Integer.parseInt(active.getText());
- count--;
- active.setText(String.valueOf(count));
- canvas.repaint();
- }
-
- /**
- * Increment finalized.
- */
- private void incrementFinalized() {
- int count = Integer.parseInt(finalized.getText());
- count++;
- finalized.setText(String.valueOf(count));
- canvas.repaint();
- }
-
- /**
- * Update memory.
- */
- private void updateMemory() {
- new Thread(new Runnable() {
- /** {@inheritDoc} */
- public void run() {
- System.gc();
- System.runFinalization();
- }
- }).run();
-
- final long total = Runtime.getRuntime().totalMemory();
- totalMemory.setText(String.valueOf(total));
- final long free = Runtime.getRuntime().freeMemory();
- freeMemory.setText(String.valueOf(free));
- final long used = total - free;
- usedMemory.setText(String.valueOf(used));
- canvas.repaint();
- }
-
- /**
- * Main.
- *
- * @param args command line arguments, ignored
- */
- public static void main(final String[] args) {
- SwingUtilities.invokeLater(new Runnable() {
- /** {@inheritDoc} */
- public void run() {
- new PSwingMemoryLeakExample();
- }
- });
- }
-}
--
Piccolo2D Developers Group: http://groups.google.com/group/piccolo2d-dev?hl=en