Я пытаюсь лучше понять и улучшить использование памяти в моем приложении Swing.
Существует экран, который пользователь имеет тенденцию многократно открывать каждый раз, когда ему нужно найти продукт для продажи. Этот экран показывает jtable с большим количеством продуктов, как показано на рисунке ниже.
Проблема в том, что когда я продолжаю открывать и закрывать этот экран, куча памяти продолжает увеличиваться, а сборщик мусора, похоже, не работает (вероятно, потому что мои объекты не освобождаются).
Я использовал java VisualVM, чтобы проверить, какие объекты больше всего занимают место в куче, и это показано на снимке экрана ниже.
Я предполагаю, что эти объекты char[] и string создаются из-за JTable.
Когда я закрываю экран, я делаю следующее
jTable1 = null;
data = null; //(arraylist where I stored the data from the database)
System.gc();
Кто-нибудь знает, что мне может не хватать? Есть ли другой способ освободить объекты, кроме установки ссылок на null?
Спасибо за помощь!
Код для структурирования данных в объект[][] для помещения в таблицу.
private Object[][] getProdutosObjects() {
ProdutoModel pm = new ProdutoModel();
try {
data = pm.getAllProducts();
} catch (DefaultException e) {
e.printStackTrace();
JOptionPane.showMessageDialog(this, e.getMsg(), "", JOptionPane.WARNING_MESSAGE);
}
Object[][] matriz = new Object[data.size()][3];
int i = 0;
for (Object p : data) {
matriz[i][0] = ((Object[])p)[0]; //codigodist
matriz[i][1] = ((Object[])p)[1]; //descricao
matriz[i][2] = ((Object[])p)[2]; //descricaodist
i++;
}
return matriz;
}
Код для создания jtable:
jTable1.setModel(new javax.swing.table.DefaultTableModel(
getProdutosObjects(),
new String [] {
"Código", "Descrição", "Descrição Distribuidor"
}
){
boolean[] canEdit = new boolean [] {
true, false, false
};
public boolean isCellEditable(int rowIndex, int columnIndex) {
return canEdit [columnIndex];
}
});
jTable1.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent event) {
jTable1.scrollRectToVisible(jTable1.getCellRect(
jTable1.getSelectedRow(), 0, true));
}
});
data
наObject[][]
. Если бы вместо этого вы использовалиAbstractTableModel
, вы могли бы получить более точный контроль над тем, что и как данные возвращаются моделью. - person MadProgrammer   schedule 01.05.2014