Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-4185691

Win32 huge memory leak with Tree demo using drawString()

XMLWordPrintable

    • 2d
    • kestrel
    • x86, sparc
    • solaris_2.6, windows_95, windows_nt

      Running this Tree.java test reveals a huge memory leak (~1.5mb per iteration) in the win32 JDK1.2-P build. Verified on winNT4.0 8 & 32 bit


      import java.awt.*;
      import java.awt.event.*;
      import java.awt.font.FontRenderContext;
      import java.awt.font.TextLayout;
      import java.awt.geom.AffineTransform;
      import java.awt.image.BufferedImage;
      import javax.swing.*;


      /**
       * Transformation of characters.
       */
      public class Tree extends JPanel implements Runnable {

          private char theC = 'A';
          private Character theT = new Character(theC);
          private Character theR = new Character((char) ((int) theC + 1));
          private Thread thread;
          private BufferedImage bimg;


          public Tree() {
              setBackground(Color.white);
          }


          public void step(int w, int h) {
              theT = new Character(theC = ((char) ((int) theC + 1)));
              theR = new Character((char) ((int) theC + 1));
              if (theR.compareTo(new Character('z')) == 0) {
                  theC = 'A';
              }
          }


          public void drawDemo(int w, int h, Graphics2D g2) {
              int mindim = Math.min(w, h);
              AffineTransform at = new AffineTransform();
              at.translate((w - mindim) / 2.0,
                           (h - mindim) / 2.0);
              at.scale(mindim, mindim);
              at.translate(0.5, 0.5);
              at.scale(0.3, 0.3);
              at.translate(-(Twidth + Rwidth), FontHeight / 4.0);
              g2.transform(at);
              tree(g2, mindim * 0.3, 0);

          }


          static Font theFont = new Font("Dialog", Font.PLAIN, 1);
          static double Twidth = 0.6;
          static double Rwidth = 0.6;
          static double FontHeight = 0.75;
          static Color colors[] = {Color.blue,
                                   Color.red.darker(),
                                   Color.green.darker()};


          public void tree(Graphics2D g2d, double size, int phase) {
              g2d.setColor(colors[phase % 3]);
              //g2d.setFont(theFont);
              g2d.drawString(theT.toString(), 0, 0);
              if (size > 10.0) {
                  AffineTransform at = new AffineTransform();
                  at.setToTranslation(Twidth, -0.1);
                  at.scale(0.6, 0.6);
                  g2d.transform(at);
                  size *= 0.6;
                  g2d.drawString(theR.toString(), 0, 0);
                  at.setToTranslation(Rwidth+0.75, 0);
                  g2d.transform(at);
                  Graphics2D g2dt = (Graphics2D) g2d.create();
                  at.setToRotation(-Math.PI / 2.0);
                  g2dt.transform(at);
                  tree(g2dt, size, phase + 1);
                  g2dt.dispose();
                  at.setToTranslation(.75, 0);
                  at.rotate(-Math.PI / 2.0);
                  at.scale(-1.0, 1.0);
                  at.translate(-Twidth, 0);
                  g2d.transform(at);
                  tree(g2d, size, phase);
              }
          }


          public Graphics2D createGraphics2D(int w, int h) {
              Graphics2D g2 = null;
              if (bimg == null || bimg.getWidth() != w || bimg.getHeight() != h) {
                  bimg = (BufferedImage) createImage(w, h);
              }
              g2 = bimg.createGraphics();
              g2.setBackground(getBackground());
              g2.clearRect(0, 0, w, h);
              g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                                  RenderingHints.VALUE_ANTIALIAS_ON);
              return g2;
          }


          public void paint(Graphics g) {
      Dimension d = getSize();
              step(d.width, d.height);
              Graphics2D g2 = createGraphics2D(d.width, d.height);
              drawDemo(d.width, d.height, g2);
              g2.dispose();
              g.drawImage(bimg, 0, 0, this);
          }


          public void start() {
              thread = new Thread(this);
              thread.setPriority(Thread.MIN_PRIORITY);
              thread.start();
          }


          public synchronized void stop() {
              thread = null;
          }


          public void run() {
              try {
                  thread.sleep(2222);
              } catch (InterruptedException e) { return; }
              Thread me = Thread.currentThread();
              while (thread == me) {
                  repaint();
                  try {
                      thread.sleep(1111);
                  } catch (InterruptedException e) { break; }
              }
              thread = null;
          }


          public static void main(String argv[]) {
              final Tree demo = new Tree();
              JFrame f = new JFrame("Java2D Demo - Tree");
              f.addWindowListener(new WindowAdapter() {
                  public void windowClosing(WindowEvent e) {System.exit(0);}
                  public void windowDeiconified(WindowEvent e) { demo.start(); }
                  public void windowIconified(WindowEvent e) { demo.stop(); }
              });
              f.getContentPane().add("Center", demo);
              f.pack();
              f.setSize(new Dimension(400,300));
              f.show();
              demo.start();
          }
      }

            dougfelt Doug Felt
            blichtensunw Brian Lichtenwalter (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: