Java / Swing - 传递Application对象

时间:2014-07-18 01:09:58

标签: java swing memory

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

  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(特别是这类东西)有点生锈。

在这种环境中,这种同步单例应用程序对象的使用是否合法?

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我认为您可以通过消除方法的synchronized性质来解决这个问题;要做到这一点,只需在加载类时初始化变量。显而易见的方法是使用静态初始化程序,您可能需要查找它 - 它是在加载类时执行的代码块,因此它在完成任何类的使用之前完成。

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

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

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