【问题标题】:Java/Swing - passing Application objectJava/Swing - 传递应用程序对象
【发布时间】:2014-07-18 01:09:57
【问题描述】:

我在负责维护的基于 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(尤其是这种东西)有点生疏。

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

我知道它的特定用法可能会导致问题,即使该方法是正确的,我想我只是想知道这是否可能是我的问题的候选者以及我应该进一步调查的事情。我觉得这个用法不对——但那可能就是我!

感谢您的帮助。

【问题讨论】:

  • How to find a Java Memory Leak 的可能重复项
  • 感谢您的链接。类似的问题(我将遵循建议的过程),但 IMO 并不完全是重复的。我想这个问题的一个更好的标题应该是“正在访问同步的 Swing 应用程序实例最佳实践吗?”但是看看链接过程会产生什么会很有趣。

标签: java swing memory


【解决方案1】:

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

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

编辑:--------

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

【讨论】:

  • 对不起,我应该澄清我所说的性能问题 - 基本上它会启动并运行几个小时,但随着时间的推移内存大小会稳步增加,CPU使用率也会增加,直到几天后整个应用程序以 100% 的 CPU 和大部分系统内存挂起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
  • 2015-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多