【问题标题】:How to release class instances and memory?如何释放类实例和内存?
【发布时间】:2015-09-09 11:10:49
【问题描述】:

我正在使用 JProfiler 对基于 swing 的桌面应用程序的内存问题进行故障排除。在 JProfiler 的内存视图中,我看到一个类的 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。有什么办法可以释放内存和实例数?

【问题讨论】:

  • 你在说什么课?
  • 您确定确实存在内存问题吗?首先,3MB 内存对于 Java 应用程序来说不算什么。你能验证这 40k 个对象最终不会被垃圾收集吗?从您展示的源代码来看,这些 Runnable 似乎没有任何东西会导致它们永远存在,而且它们本身也不会获取大量数据。我相信,JProfiler 只能向您显示“活动”对象的内存统计信息。这包括他们吗?
  • 是的,我第二个@Thilo,3MB 不算什么。

标签: java swing jprofiler


【解决方案1】:

您确定正确关闭所有需要关闭的引擎吗?

你写“从事件新行添加到 JTable”这似乎是不好的模式,但代码使用了一种模型,可以很好。

具有非常大数据集的 JTable 可以/应该在“虚拟”模式下使用。看看谷歌。 4MB 的 RAM 通常不是问题,但收集垃圾 40k“对象”可能很难:(

【讨论】:

  • 将尝试在虚拟模式下实现 JTable :) 可能在这里使用分页。
猜你喜欢
  • 2015-10-29
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2013-07-06
  • 1970-01-01
  • 2011-01-31
相关资源
最近更新 更多