我在基于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(特别是这类东西)有点生锈。
在这种环境中,这种同步单例应用程序对象的使用是否合法?
我知道即使方法合理,它的特殊用法也可能导致问题,我想我只是想知道这是否可能是我的问题的候选人,我应该进一步调查。用法让我感觉不对 - 但那可能就是我!
感谢您的帮助。
答案 0 :(得分:1)
我认为您可以通过消除方法的synchronized
性质来解决这个问题;要做到这一点,只需在加载类时初始化变量。显而易见的方法是使用静态初始化程序,您可能需要查找它 - 它是在加载类时执行的代码块,因此它在完成任何类的使用之前完成。
与没有同步的方法调用相比,同步方法可能需要很长时间,因此这是一件容易尝试的事情。它与Swing没什么关系,但在这种情况下做一些事情要简单得多。
编辑:--------------------
你没有说你为什么怀疑内存泄漏,或者你的意思是“性能问题”;我认为在Swing或其他GUI应用程序中,除了对方法的同步调用之外,在某个地方出现“性能问题”更为常见,即使它经常被调用。但是这是你识别的代码,我看到的第一件事与性能有关。我希望它有所帮助,但如果你的问题是你没有说过并且是由你没有提到的东西造成的,那么我也不会感到惊讶。只是说。