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

Memory leak using OleInitialize()/OleUninitialize() in SWT

XMLWordPrintable

    • b03
    • x86
    • windows_xp, windows_7
    • Verified

      From https://bugs.eclipse.org/bugs/show_bug.cgi?id=127374 :

      I believe that JFieldText uses
      OLE somehow (Drag&Drop or clipboard) and relies on paired calls to
      OleInitialize()/OleUninitialize() to free up memory, but because of the extra
      calls made by the testcase, the OLE ref count does not go down to zero and
      memory is leaked. Please could you take a look at this?

      import java.awt.*;

      import javax.swing.JFrame;
      import javax.swing.JLabel;
      import javax.swing.JTextField;

      import org.eclipse.swt.internal.win32.*;
      //import org.eclipse.swt.widgets.Display;

      /**
       * @author scheglov_ke
       */
      public class PR127374 {
              /**
               * @param args
               */
              public static void main(String[] args) throws Exception {
                      //Display display = new Display();
                              OS.OleInitialize(0);
                      //
                      for (int i = 0; i < 100; i++) {
                          System.out.println(i);
                          JFrame frame = new JFrame();
                          //
                          JTextField textField = new JTextField();
                          frame.getContentPane().add(textField, BorderLayout.NORTH);
                          //
                          JLabel label = new JLabel(getBigString());
                          frame.getContentPane().add(label, BorderLayout.SOUTH);
                          //
                          frame.setVisible(true);
                          frame.setVisible(false);
                          //frame.getContentPane().remove(textField); //un-comment
      this line to remove leak
                          frame.dispose();
                          //
                          PR127374.printMemory();
                      }
                      OS.OleUninitialize();
                      //display.dispose();
                      //
                      Thread.sleep(100000);
              }
              private static void printMemory() {
                      System.gc();
                      System.out.println(Runtime.getRuntime().totalMemory() -
      Runtime.getRuntime().freeMemory());
              }
              private static String getBigString() {
                      int size = 1024 * 1024;
                      StringBuffer sb = new StringBuffer(size);
                      for (int i = 0; i < size; i++) {
                              sb.append('*');
                      }
                      return sb.toString();
              }
      }

            uta Alexey Utkin (Inactive)
            agerasimsunw Alexander Gerasimov (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: