2014-05-01 25 views
1

我試圖更好地理解和改進Swing應用程序的內存使用情況。使用JTable char [],字符串和對象消耗Java堆空間

有一個屏幕,用戶每次需要搜索產品時都會反覆打開。這個屏幕顯示了一個有很多產品的jtable,如下圖所示。

enter image description here

的問題是,當我不斷打開和關閉該屏幕,堆內存不斷增加和垃圾收集器似乎並沒有被工作(可能是因爲我的對象沒有被釋放)。

我用java VisualVM檢查哪些對象最耗費堆空間,下面的屏幕截圖顯示了它。

enter image description here

我假定正在創建因爲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)); 
      } 
     }); 
+1

我不知道爲什麼你需要從'data'轉換到Object [] []'。如果你使用'AbstractTableModel'來代替,你可以更好地控制模型返回的數據的數據和方式 – MadProgrammer

+0

是的..我認爲這將是一個更好的選擇,以便在創建JTable時執行更少的操作。我現在嘗試了它,並直接使用我的列表數據創建了自己的模型,但問題仍然存在。它持續初始化所有char [],Strings和Integers對象,並且它們不會從內存中釋放。 – user2402105

+0

可以使用JVisualVM查看特定類型的單個對象,然後查看它們的傳入引用。這會告訴你什麼是保持對象的活着。 –

回答

0

使弱或軟引用的對象,使GC將達到一定的閾值週期後清除引用。