2015-09-09 56 views
0

我正在使用JProfiler來解決我的基於swing的桌面應用程序的內存問題。在JProfiler的Memory視圖中,我看到40K實例的一個類和使用3MB的內存如何釋放類實例和內存?

DefaultTableModel summaryModel = null; 

void insertEnv(final Map<String, String> configMap,final String variable,final String value) 
{ 
    this.configMap = configMap; 

    Runnable runnable = new Runnable() 
    { 
     public void run() 
     {    
      Vector dataVector = summaryModel.getDataVector(); 

      for(int row = 0; dataVector != null && row < dataVector.size(); row++) 
      { 
       Vector rowData = (Vector)dataVector.get(row); 
       if(rowData.get(0).toString().equals(variable)) 
       { 
        summaryModel.removeRow(row); 
       } 
      } 

      Object[] row = new Object[] {variable, value }; 
      summaryModel.addRow(row);    
     } 
    }; 

    SwingUtilities.invokeLater(runnable); 
} 

在insertEnv()函數中,我在JTable中添加了新行。這個函數被稱爲40K倍,因此被稱爲40K以上的類。可以做些什麼來釋放內存和實例數量?

+1

你在說什麼課? – BetaRide

+1

你確定實際上有內存問題?首先, 3MB內存對於Java應用程序來說沒有任何意義,你能否證實40k對象最終不會被垃圾回收?從你展示的源代碼中,這些可運行內容似乎沒有任何東西會導致它們永遠停留在他們自己並沒有獲取大量的數據JProfiler可以顯示你的內存統計信息,只有「活的」對象,我相信,這是否包括他們? – Thilo

+0

是的,我第二@Thilo,3MB是沒有。 – Cosmin

回答

0

您確定要正確關閉引擎需要關閉的所有內容嗎?

你寫了「添加從事件新行到JTable」這似乎是不好的模式,但代碼使用一種模型,可以很好。

具有非常大的數據集的JTable可以/應該在「虛擬」模式下使用。看看谷歌。 4MB內存通常不是問題,但收集垃圾40k「對象」可能很難:(

+0

將試圖實現JTable虛擬模式:)可能在這裏使用分頁。 – amit