我在基於Swing的應用程序中遇到了一些性能問題我一直負責維護 - 我懷疑是內存泄漏。分析之後,似乎在主應用程序類(即入口點)中花費了非常大量的時間,具體而言,在傳遞對其自己的應用程序對象的引用的方法中,如下所示:Java/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();
}
}
});
反正我有很少的搖擺,以及我的Java(尤其是這種東西)有點生疏。
這種使用同步的單例應用程序對象在這種環境中是否合法?
我知道它的特殊用法可能會導致問題,即使方法是正確的,我想我只是想知道這是否是我的問題的可能候選人,並且我應該進一步調查。這種用法對我來說是錯誤的 - 但那可能就是我!
感謝您的幫助。
可能重複的[如何找到Java內存泄漏](http://stackoverflow.com/questions/40119/how-to-find-a-java-memory-leak) – DavidPostill
感謝您的鏈接。類似的問題(我會按照建議的流程),但IMO不完全是重複的。 我想這個問題的一個更好的標題就像'正在訪問一個同步的Swing應用程序實例最佳實踐? 但是看到鏈接過程產生什麼會很有趣。 – Caligari