import javax.swing.*;
public class Main
{
public Main()
{
JFrame jf = new JFrame(\"Demo\");
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Given the invokeLater()
call, the call to GC will probably occur 1st1.
BTW - calling Runtime.gc()
is generally pointless, the JRE won't GC till it needs to.
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");
}
}
When a JFrame
is created, it registers itself in some internal Swing data structures which allow it to receive events like mouse clicks. This means there is a reference to your object lurking somewhere until you tell Swing to get rid of the window using dispose()
.
The frame is visible and the reference to the object is reachable by at least one of the GUI threads (the Event Dispatch Thread). That is why it isn't garbage collected.
If you want it to disapear, use frame.dispose().