扩展的JTextField内存泄漏

时间:2014-09-02 19:08:46

标签: java swing memory-leaks visualvm extending

我认为我有内存泄漏,但我不确定我是否正确解释了这一点。我正在运行一个查询SQL数据库的应用程序,以获取我随后放入两个单独的JTable中的信息。

这很好用。

我创建了一个自定义类,用于搜索扩展JTextField的表,基于我在interweb上找到的一个简洁的方法。

这是我遇到问题的地方。

我发现如果我创建了JSearchBar对象并且不将它添加到框架中,我就不会遇到任何问题。但是,如果我创建JSearchBar并将其添加到JFrame,一旦显示我的java应用程序的内存使用量攀升,爬升和爬升。显示JSearchBar后,CPU使用率将从0反弹到1.没有它在帧上,它将保持为0.

[edit] 我还注意到,如果我的JFrame没有焦点,或者它有焦点但未选择搜索栏,则内存使用量仍会增加,但只有大约10K在一次,而不是数百K的时间。的 [/编辑]

这是我的自定义类的代码。有一次,我添加了一些System.out.println();对于每个听众方法,没有任何事情发生,所以我不确定为什么记忆正在攀升。

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

public class JSearchBar extends JTextField
{   
    JTable[] t;

    public JSearchBar()
    {
        super("No Associated Tables", 11);
    }

    public JSearchBar(JTable... t)
    {
        super(10);
        this.getDocument().addDocumentListener(new searchHandler());
        this.t = t;
    }

    private class searchHandler implements DocumentListener
    {
        public void changedUpdate(DocumentEvent e)
        {
            System.out.println("changedUpdate");
        }

        public void insertUpdate(DocumentEvent e)
        {
            try
            {
                int L = e.getDocument().getLength();
                String text = e.getDocument().getText(0,L);

                newFilter(text);
            }
            catch(Exception ex)
            {
                ex.printStackTrace();
            }
        }

        public void removeUpdate(DocumentEvent e)
        {
            try
            {
                int L = e.getDocument().getLength();
                String text = e.getDocument().getText(0,L);

                newFilter(text);
            }
            catch(Exception ex)
            {
                ex.printStackTrace();
            }
        }

        private void newFilter(String filterText) 
        {
            RowFilter<MyTableModel, Object> rf = null;
            //If current expression doesn't parse, don't update.
            try {
                rf = RowFilter.regexFilter("(?iu)" + filterText);
            } catch (java.util.regex.PatternSyntaxException e) {
                return;
            }
            for(int i = 0; i < t.length; i++)
            {
                TableRowSorter<MyTableModel> trs = (TableRowSorter<MyTableModel>)t[i].getRowSorter();
                trs.setRowFilter(rf);
            }
        }
    }
}

以下是我的VisualVM中的一些图表

VisualVM of Probable MemLeak

感谢您提出任何意见!!

[EDIT2}

我用JTextField替换了JSearchBar,它具有相同的行为。好消息是我没有造成内存泄漏。但是,我仍然想知道为什么JTextField正在消耗这样的内存。

[UPDATE]

这是我的堆的更新图形。不确定这里发生了什么。

MemLeak2

0 个答案:

没有答案