我认为我有内存泄漏,但我不确定我是否正确解释了这一点。我正在运行一个查询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中的一些图表
感谢您提出任何意见!!
[EDIT2}
我用JTextField替换了JSearchBar,它具有相同的行为。好消息是我没有造成内存泄漏。但是,我仍然想知道为什么JTextField正在消耗这样的内存。
[UPDATE]
这是我的堆的更新图形。不确定这里发生了什么。