1
我試圖更好地理解和改進Swing應用程序的內存使用情況。使用JTable char [],字符串和對象消耗Java堆空間
有一個屏幕,用戶每次需要搜索產品時都會反覆打開。這個屏幕顯示了一個有很多產品的jtable,如下圖所示。
的問題是,當我不斷打開和關閉該屏幕,堆內存不斷增加和垃圾收集器似乎並沒有被工作(可能是因爲我的對象沒有被釋放)。
我用java VisualVM檢查哪些對象最耗費堆空間,下面的屏幕截圖顯示了它。
我假定正在創建因爲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'來代替,你可以更好地控制模型返回的數據的數據和方式 – MadProgrammer
是的..我認爲這將是一個更好的選擇,以便在創建JTable時執行更少的操作。我現在嘗試了它,並直接使用我的列表數據創建了自己的模型,但問題仍然存在。它持續初始化所有char [],Strings和Integers對象,並且它們不會從內存中釋放。 – user2402105
可以使用JVisualVM查看特定類型的單個對象,然後查看它們的傳入引用。這會告訴你什麼是保持對象的活着。 –