сборщик мусора для объекта JFrame - PullRequest
1 голос
/ 23 марта 2012
import javax.swing.*;

public class Main
{
    public Main()
    {
        JFrame jf = new JFrame("Demo");
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setSize(100, 100);
        jf.setVisible(true);
    }
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new Main();
            }
        });
        Runtime.getRuntime().gc();

    }

}

Я звоню Runtime.getRuntime().gc(); для явного вызова сборщика мусора.Но окно не исчезает с экрана, почему сборщик мусора не возвращает объект JFrame?

Ответы [ 3 ]

8 голосов
/ 23 марта 2012

Когда создается JFrame, он регистрируется в некоторых внутренних структурах данных Swing, которые позволяют ему получать такие события, как щелчки мыши. Это означает, что где-то скрывается ссылка на ваш объект, пока вы не скажете Swing избавиться от окна с помощью dispose().

5 голосов
/ 23 марта 2012

Учитывая вызов invokeLater(), вызов в GC, вероятно, произойдет 1-го 1 .

Кстати - звонить по номеру Runtime.gc() обычно бессмысленно, JRE не будет собирать GC, пока в этом нет необходимости.

  1. Е.Г.

выход

GC called
Frame visible

код

package test;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class VisibleFrameGC {

    VisibleFrameGC() {
        JFrame jf = new JFrame("Demo");
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setSize(100, 100);
        jf.setVisible(true);
        System.out.println("Frame visible");
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new VisibleFrameGC();
            }
        });
        Runtime.getRuntime().gc();
        System.out.println("GC called");
    }
}
4 голосов
/ 23 марта 2012

Рамка видима, и ссылка на объект доступна по крайней мере одним из потоков GUI (поток обработки событий). Вот почему это не мусор.


Если вы хотите, чтобы он исчез, используйте frame.dispose().

...