Java Swing JTree 未被垃圾回收

标签 java swing memory garbage-collection memory-leaks

以下演示应用程序创建了一个带有 JInternalFrame(MDI 接口(interface))的 JFrame。内部框架以 JTree 为特色,带有 JTree 模型。为了模拟大型模型,JTree 模型关联了一个 10MB 的缓冲区。当内部框架关闭(处置)时,JTree 及其模型将永远不会被垃圾回收。

jvisualvm 显示了原因——一些静态 Swing 类字段将保留对 JTree 的引用。与其他 Swing 内存泄漏不同,这里没有使用事件处理程序。

这是一个错误吗?是否有一个干净的解决方案来收集已处理的内部框架、它的树和它的模型(除了使用弱引用、使 JTree 模型中的数据无效等变通方法)?

import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;

public class Test extends javax.swing.JFrame {

   public Test() {
      javax.swing.JDesktopPane jDesktopPane = new javax.swing.JDesktopPane();
      setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
      setContentPane(jDesktopPane);
      InternalTreeFrame f = new InternalTreeFrame();
      jDesktopPane.add(f);
      f.show();
      pack();
      setBounds(10, 10, 400, 300);
   }

   public class InternalTreeFrame extends javax.swing.JInternalFrame {
      public InternalTreeFrame() {
  javax.swing.JScrollPane jScrollPane = new javax.swing.JScrollPane();
  javax.swing.JTree jTree = new javax.swing.JTree();
  jScrollPane.setViewportView(jTree);
  jTree.setModel(new DefaultTreeModel(new DefaultMutableTreeNode(new LargeObject("big root"))));
  setContentPane(jScrollPane);
  setClosable(true);
     setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
  pack();
  setBounds(10, 10, 300, 200);
      }
   }

   // 10MB helper object, easy to spot in visual vm heap dump
   public class LargeObject {
      public LargeObject(String name) {
  this.name = name;
  buff = new byte[1024*1024*10];
      }

      @Override
      public String toString() {
  return name;
      }

      private final String name;
      private final byte[] buff;
   }

   public static void main(String args[]) {
      java.awt.EventQueue.invokeLater(new Runnable() {
  public void run() {
     new Test().setVisible(true);
  }
      });
   }
}

最佳答案

不确定这是否是错误,但解决方案是在(内部)框架的 windowClosing() 事件中将空模型设置到 JTree

关于Java Swing JTree 未被垃圾回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4517931/

相关文章:

java - 月份日历的数据结构

Java - 做大型 GUI 项目

java - 为事件调度程序暂停

c - 将保存未知长度的字符串并能够稍后删除它们的数据结构

c++ - "std::string + char"表达式是否创建另一个 std::string?

java - 使用默认程序打开 Excel 文件

java - 正则表达式替换替换字符串

java - Astyanax 的 EntityPersister 和 Collection 更新

java - Swing JEditorPane CSS 功能

iOS safari 崩溃(问题反复出现)