JPanels的Java内存泄漏问题

1 java

Java内存泄漏

private boolean refreshResponseWindow(MessageObject message) {
  this.responsePanel.removeAll();
  this.responsePanel.add(message.buildGUI());
  this.responsePanel.validate();
  message = null;
  return true;
Run Code Online (Sandbox Code Playgroud)

}

发生的问题是当我收到越来越多的消息时,我的Java程序的内存使用量继续增长,最终导致它被锁定.我已将内存泄漏隔离到上面的代码,特别是添加过程调用.我假设removeAll会清除我面板的内容,但它似乎仍在继续增长.

注意:message.buildGUI()返回一个显示在responsePanel上的JPanel

跟进:

BuildGUI代码如此显示

public JPanel buildGUI() throws Exception {
    JPanel busPanel = new JPanel();
    busPanel.setLayout(new GridBagLayout());
    busPanel.setPreferredSize(new Dimension(Globals.panelW, Globals.panelH));
    busPanel.setMinimumSize(new Dimension(Globals.panelW, Globals.panelH));

    final JLabel headingLabel = new JLabel();
    headingLabel.setFont(new Font("", Font.PLAIN, 18));
    headingLabel.setText(this.name);
    final GridBagConstraints gridBagConstraints_heading = new GridBagConstraints();
    gridBagConstraints_heading.gridwidth = 2;
    gridBagConstraints_heading.gridy = 0;
    gridBagConstraints_heading.gridx = 0;
    busPanel.add(headingLabel, gridBagConstraints_heading);
    //Many more gui components marked as final
    return busPanel;
Run Code Online (Sandbox Code Playgroud)

返回的面板没有监听器仅用于显示目的.

Sam*_*num 5

buildGUI方法是否将侦听器添加到业务对象中?这是内存泄漏的常见原因.调用responsePanel.removeAll()将删除组件,但组件仍可能在responsePanel其他对象上注册为侦听器,从而导致它们保留在内存中.