Java/Swing传递应用程序对象

Java/Swing传递应用程序对象,java,swing,memory,Java,Swing,Memory,我一直负责维护的基于Swing的应用程序出现了一些性能问题,我怀疑内存泄漏。分析之后,似乎在主应用程序类(即入口点)中花费了大量时间,特别是在将引用传递给自己的应用程序对象的方法中,如下所示: public synchronized static ProblemApplication getApplication() { if (s_Instance == null) { initializeInstance(); } return (ProblemApp

我一直负责维护的基于Swing的应用程序出现了一些性能问题,我怀疑内存泄漏。分析之后,似乎在主应用程序类(即入口点)中花费了大量时间,特别是在将引用传递给自己的应用程序对象的方法中,如下所示:

  public synchronized static ProblemApplication getApplication() {
    if (s_Instance == null) {
      initializeInstance();
    }
    return (ProblemApplication ) s_Instance;
  }

  private synchronized static void initializeInstance() {
    s_Instance = Application.getInstance();
  }
这在整个代码中被称为很多-一种典型用法:

  private void updateSensorsModel() {
    ProblemApplication application = ProblemApplication .getApplication();

    int sensorIndex = 0;
    m_SensorModels.clear();

    // add sensors information
    for (SensorConfiguration s : application.getSensorsConfiguration().getSensors()) {
      m_SensorModels.add(new SensorModel(sensorIndex, application));
      sensorIndex++;
    }

    // add extra session information
    for (ExtraSession es : application.getSession().getExtraSessions()) {
      m_SensorModels.add(new SensorModel(-1, application, es.getDeviceID()));
    }
  }
还有一些行动听众:

// listeners
final TechsasSession session = TechsasApplication.getApplication().getSession();
session.addPropertyChangeListener(new PropertyChangeListener() {

  @Override
  public void propertyChange(PropertyChangeEvent evt) {
    if (evt.getPropertyName().equals("sensorsConfiguration")) {
      SensorTableModel model = sensorTable.getModel();
      model.updateModel();
      repaint();
    }
  }
});
不管怎么说,我的Swing很少,我的Java(尤其是这类东西)有点生锈

在这种环境中使用同步单例应用程序对象合法吗

我知道它的特殊用法可能会导致问题,即使方法是合理的,我想我只是想知道这是否是我的问题的一个可能的候选者,我应该进一步调查。我觉得这个用法不对,但那可能就是我


谢谢你的帮助。

我想你可以通过消除方法的
同步性来解决这个问题;为此,只需在加载类时初始化变量。实现这一点的明显方法是使用静态初始值设定项,您可能需要查找它——它是一个在加载类时执行的代码块,因此它在使用该类之前完成

与不进行同步的方法调用相比,同步方法可能需要花费大量时间,因此这是一件容易尝试的事情。它与Swing没有多大关系,但在这种情况下,做一些事情要简单得多

编辑:--------------------


你不会说你为什么怀疑内存泄漏,或者你所说的“性能问题”是什么意思;我认为,在Swing或其他GUI应用程序中,除了对方法的同步调用之外,还有一个“性能问题”更为常见,即使它经常被调用。但这是您识别的代码,也是我看到的第一个与性能相关的代码。我希望这会有帮助,但如果你的问题是你没有说的,是由你没有提到的东西引起的,我也不会感到惊讶。只是说。

对不起,我应该澄清我所说的性能问题-基本上它会启动并正常运行几个小时,但随着时间的推移,内存大小会稳步增加,CPU使用率也会增加,直到几天后整个应用程序在100%CPU和大部分系统内存上挂起。可能重复感谢链接。类似的问题(我将遵循建议的过程),但我并不完全是重复的。我想这个问题最好的标题应该是“正在访问同步Swing应用程序实例最佳实践吗?”但看看链接的过程会产生什么结果会很有趣。