2015-09-09 151 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