2014-07-18 67 views
0

我在基於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(尤其是這種東西)有點生疏。

這種使用同步的單例應用程序對象在這種環境中是否合法?

我知道它的特殊用法可能會導致問題,即使方法是正確的,我想我只是想知道這是否是我的問題的可能候選人,並且我應該進一步調查。這種用法對我來說是錯誤的 - 但那可能就是我!

感謝您的幫助。

+0

可能重複的[如何找到Java內存泄漏](http://stackoverflow.com/questions/40119/how-to-find-a-java-memory-leak) – DavidPostill

+0

感謝您的鏈接。類似的問題(我會按照建議的流程),但IMO不完全是重複的。 我想這個問題的一個更好的標題就像'正在訪問一個同步的Swing應用程序實例最佳實踐? 但是看到鏈接過程產生什麼會很有趣。 – Caligari

回答

1

我想你可以通過消除​​這個方法來解決這個問題;要做到這一點,只需在加載類時初始化變量即可。要做到這一點的顯而易見的方法是使用一個靜態初始化器,您可能需要查看它 - 這是一個代碼塊,在加載類時執行,因此在任何使用類之前完成。

與沒有同步的方法調用相比,同步方法可能需要很長時間,所以這是一件容易的事情。它與Swing沒有多大關係,但在這種情況下做些事情要簡單得多。

編輯:--------------------

你不說你爲什麼懷疑有內存泄漏,或者你確實通過一個意思「性能問題「;我認爲在Swing或其他GUI應用程序中,除了對方法的同步調用之外,還有一個「性能問題」,即使它經常被調用也更爲常見。但這是確定的代碼,我看到的第一件事與它的性能有關。我希望它有幫助,但是如果你的問題是你沒有說過的,並且是由你沒有提到的東西引起的,那麼它不會讓我感到驚訝。只是說。

+0

對不起,應該澄清我的性能問題 - 基本上它會啓動並運行幾個小時,但隨着時間的推移,內存大小將穩步增加,並且CPU使用率也會增加,直到整個應用程序掛起幾天後,100%CPU和大部分系統內存。 – Caligari

相關問題