Опитвам се да разбера по-добре и да подобря използването на паметта на моето приложение 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