【发布时间】: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(尤其是这种东西)有点生疏。
在这种环境中使用同步的单例应用程序对象合法吗?
我知道它的特定用法可能会导致问题,即使该方法是正确的,我想我只是想知道这是否可能是我的问题的候选者以及我应该进一步调查的事情。我觉得这个用法不对——但那可能就是我!
感谢您的帮助。
【问题讨论】:
-
感谢您的链接。类似的问题(我将遵循建议的过程),但 IMO 并不完全是重复的。我想这个问题的一个更好的标题应该是“正在访问同步的 Swing 应用程序实例最佳实践吗?”但是看看链接过程会产生什么会很有趣。