eXX*_*XX2 1 java swing garbage-collection jframe
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();
}
}
Run Code Online (Sandbox Code Playgroud)
我呼吁Runtime.getRuntime().gc();显式垃圾收集器调用.但窗口不会从屏幕上消失,为什么垃圾收集器不回收JFrame的对象?
当JFrame被创建时,它注册本身在一些内部摇摆的数据结构,其允许它接收到类似的鼠标点击的事件.这意味着你的对象潜伏在某个地方,直到你告诉Swing摆脱使用窗口dispose().
在给出invokeLater()调用的情况下,对GC的调用可能会发生在第1个1.
BTW - 调用Runtime.gc()通常是没有意义的,JRE在它需要之前不会GC.
GC called
Frame visible
Run Code Online (Sandbox Code Playgroud)
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");
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
873 次 |
| 最近记录: |