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(); } }
我调用Runtime.getRuntime().gc();
用于显式垃圾收集器调用。 但是窗口不会从屏幕上消失,为什么垃圾收集器不会回收JFrame的对象?
创建JFrame
,它会在一些内部Swing数据结构中注册自己,允许它接收鼠标点击等事件。 这意味着你的对象潜伏在某处,直到你告诉Swing使用dispose()
摆脱窗口。
给定invokeLater()
调用,对GC的调用可能会发生在1st 1 。
BTW – 调用Runtime.gc()
通常是没有意义的,JRE在它需要之前不会使用GC。
- 例如
产量
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"); } }
框架是可见的,并且至少一个GUI线程(事件调度线程)可以访问对象的引用。 这就是它不是垃圾收集的原因。
如果您希望它frame.dispose()
,请使用frame.dispose()
。
- 如何根据输入长度更改DecimalFormat行为?
- S3:如果由其他用户创建,则用户无法访问自己的s3存储桶中的对象
- 没有为类org.json.JSONObject找到序列化程序,也没有发现创建BeanSerializer的属性
- 使Eclipse使用src / test / resources而不是src / main / resources
- Jersey,Jackson和JAX-RS POST多种JSON格式
- 在正则表达式中设置最小和最大字符?
- Hibernate 5.2.2:没有EntityManager的持久性提供程序
- 模拟CGLIB增强对象
- 我们是否有任何通用function来检查页面是否已在Selenium中完全加载