Java 已处理的JFrame仍从Window.getWindows()返回
在下面的示例中,大型机创建其他JFrame。这些新创建的帧已将DISPOSE_ON_CLOSE设置为默认关闭操作。单击“关闭”按钮时,帧消失,但仍可从窗口中使用。getWindows()方法。当我打开4个窗口时,关闭它们,然后单击显示的“打印窗口计数”Java 已处理的JFrame仍从Window.getWindows()返回,java,swing,jframe,Java,Swing,Jframe,在下面的示例中,大型机创建其他JFrame。这些新创建的帧已将DISPOSE_ON_CLOSE设置为默认关闭操作。单击“关闭”按钮时,帧消失,但仍可从窗口中使用。getWindows()方法。当我打开4个窗口时,关闭它们,然后单击显示的“打印窗口计数” Windows: 4 如何使它们从所有不受我控制的Swing资源中永久消失 在现实世界中,这些帧包含许多其他引用,这会导致内存泄漏,因为它们永远不会被垃圾收集 import javax.swing.*; import java.awt.Bord
Windows: 4
如何使它们从所有不受我控制的Swing资源中永久消失
在现实世界中,这些帧包含许多其他引用,这会导致内存泄漏,因为它们永远不会被垃圾收集
import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Window;
public class MainFrame extends JFrame {
public static void main(String[] args) {
MainFrame t = new MainFrame();
SwingUtilities.invokeLater(() -> t.setVisible(true));
}
public MainFrame() {
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JButton newWindowButton = new JButton("Open window");
newWindowButton.addActionListener((action) -> {
JFrame otherFrame = createChildFrame();
otherFrame.setVisible(true);
});
JButton printWidnowsButton = new JButton("Print windows count");
printWidnowsButton.addActionListener((action) -> {
System.out.println("Windows: " + Window.getWindows().length);
});
Container cp = getContentPane();
cp.setLayout(new BorderLayout());
cp.add(newWindowButton);
cp.add(printWidnowsButton, BorderLayout.SOUTH);
pack();
}
private JFrame createChildFrame() {
JFrame otherFrame = new JFrame();
otherFrame.setBounds(0, 0, 100, 100);
otherFrame.setDefaultCloseOperation(
WindowConstants.DISPOSE_ON_CLOSE);
return otherFrame;
}
}
虽然说“这些组件的资源将被销毁,它们消耗的任何内存都将返回到操作系统,并且它们将被标记为不可扩展。”,但我被告知,当JFrame及其子级的所有引用都消失时,就会发生这种情况
因此,如果您执行JFrame,那么您的frame=null代码>它应该可以工作。虽然说“这些组件的资源将被销毁,它们消耗的任何内存都将返回到操作系统,并且它们将被标记为不可扩展。”,但我被告知,当JFrame及其子代的所有引用都消失时,就会发生这种情况
因此,如果您执行JFrame,那么您的frame=null代码>它应该可以工作
在现实世界中,这些帧包含许多其他引用,这会导致内存泄漏,因为它们永远不会被垃圾收集
import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Window;
public class MainFrame extends JFrame {
public static void main(String[] args) {
MainFrame t = new MainFrame();
SwingUtilities.invokeLater(() -> t.setVisible(true));
}
public MainFrame() {
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JButton newWindowButton = new JButton("Open window");
newWindowButton.addActionListener((action) -> {
JFrame otherFrame = createChildFrame();
otherFrame.setVisible(true);
});
JButton printWidnowsButton = new JButton("Print windows count");
printWidnowsButton.addActionListener((action) -> {
System.out.println("Windows: " + Window.getWindows().length);
});
Container cp = getContentPane();
cp.setLayout(new BorderLayout());
cp.add(newWindowButton);
cp.add(printWidnowsButton, BorderLayout.SOUTH);
pack();
}
private JFrame createChildFrame() {
JFrame otherFrame = new JFrame();
otherFrame.setBounds(0, 0, 100, 100);
otherFrame.setDefaultCloseOperation(
WindowConstants.DISPOSE_ON_CLOSE);
return otherFrame;
}
}
这些窗口存储为弱引用,因此垃圾收集器可以将它们从内存中删除
在现实世界中,这些帧包含许多其他引用,这会导致内存泄漏,因为它们永远不会被垃圾收集
import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Window;
public class MainFrame extends JFrame {
public static void main(String[] args) {
MainFrame t = new MainFrame();
SwingUtilities.invokeLater(() -> t.setVisible(true));
}
public MainFrame() {
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JButton newWindowButton = new JButton("Open window");
newWindowButton.addActionListener((action) -> {
JFrame otherFrame = createChildFrame();
otherFrame.setVisible(true);
});
JButton printWidnowsButton = new JButton("Print windows count");
printWidnowsButton.addActionListener((action) -> {
System.out.println("Windows: " + Window.getWindows().length);
});
Container cp = getContentPane();
cp.setLayout(new BorderLayout());
cp.add(newWindowButton);
cp.add(printWidnowsButton, BorderLayout.SOUTH);
pack();
}
private JFrame createChildFrame() {
JFrame otherFrame = new JFrame();
otherFrame.setBounds(0, 0, 100, 100);
otherFrame.setDefaultCloseOperation(
WindowConstants.DISPOSE_ON_CLOSE);
return otherFrame;
}
}
这些窗口存储为弱引用,因此垃圾收集器可以将它们从内存中删除。dispose
通常只处理帧使用的本机资源,而不处理帧对象本身。您可以<代码>处理<代码> jFrase>代码> >稍后重新打开它,也可以考虑在计算Windows >代码>处置< /COD>之前运行垃圾回收循环,通常只处理框架使用的本机资源,不处理框架对象本身。你可以<代码>处理<代码> jFrase>代码> >稍后重新打开它。你也可以考虑运行垃圾回收循环,然后在查看OP代码的Windows SIF之前,你可以看到它们不保存对他们想要关闭的JFrice的引用。Matt是对的,我不保留任何对JFrrar的引用。斯温是的。otherFrame是保存在堆栈框架上的本地引用(lamba代码)。仅使用保留字new
创建引用(变量名和内存位置之间)。因此,是的,创建的每个对象都有一个引用。然后,要从JFrame对象释放内存,可以使用保留字null
。关于。@tomyforever它只会将其标记为符合垃圾收集条件,假设系统没有维护对其任何部分(即本机资源或侦听器)的引用。即便如此,Swing也倾向于抓住一个单打window@MadProgrammer你是对的,但我的回答也没有错。为什么我投了反对票?许多答案都谈到asignnull
和垃圾收集器。如果你看op的代码,你会发现他们没有保留对想要关闭的jframe的引用。Matt是对的,我没有保留对jframe的任何引用。斯温是的。otherFrame是保存在堆栈框架上的本地引用(lamba代码)。仅使用保留字new
创建引用(变量名和内存位置之间)。因此,是的,创建的每个对象都有一个引用。然后,要从JFrame对象释放内存,可以使用保留字null
。关于。@tomyforever它只会将其标记为符合垃圾收集条件,假设系统没有维护对其任何部分(即本机资源或侦听器)的引用。即便如此,Swing也倾向于抓住一个单打window@MadProgrammer你是对的,但我的回答也没有错。为什么我投了反对票?许多答案都谈到asignnull
和垃圾收集器。这似乎是正确的答案。O打开JVisualVm并调用垃圾收集。在此之后,窗口计数为1(只剩下主帧)。谢谢。这似乎是正确的答案。O打开JVisualVm并调用垃圾收集。在此之后,窗口计数为1(只剩下主帧)。谢谢