2009-11-12 31 views
1

我們有一個基於swt和在linux上運行的監視應用程序。我們有幾個按鈕和一個動態部分,隨着我們點擊這些按鈕而發生變化。問題是,如果有些點擊太快,CPU可以達到100%並永久懸掛。我們只在Ubuntu Linux上觀察到了這種快速的CPU峯值,因爲它運行的時候沒有癢。我們確信,無論何時點擊(我們有動態部分)按鈕,我們的應用都會進行重新繪製,這是設計。動態部分不僅僅是問題。一種解決方案是忽略快速點擊。Linux上的swt GUI性能問題

我們想知道我們是否可以忽略快速按鈕點擊,以避免cpu一路跳到100%。如果這不起作用,我們可能不得不重新設計我們更喜歡的動態部分作爲最後一個選項。建議/意見非常感謝。

回答

0

另一種解決方案是提高你的記憶與-Xms512m -Xmx512m

+0

隨着更多的調查,我發現我的Linux機器內存不足,我在日誌中什麼也看不到。我的堆內存在限制範圍內。所以現在我懷疑可能會有一些本機內存泄漏,因爲我們正在使用swt。當我查看代碼時,一個類正在使用finalize方法來處理swt對象。我懷疑這可能是罪魁禍首。這個對象是由gc完成的,但留下本機內存資源並導致泄漏? – Kishore 2010-03-16 16:13:22

+0

可能...最終確定是不確定的。您不能使用finalize來釋放SWT中的內存。 – nanda 2010-03-22 14:28:09

+0

是的。我們有代碼來完成方法中釋放本機內存。雖然我們沒有重新考慮它,但我們有計劃這樣做。 – Kishore 2010-06-23 14:52:16

0

這聽起來像應用程序只是死鎖。你在使用線程嗎?

檢查重繪是否確實是掛起應用程序的根本原因。還要檢查以確定它正在使用哪個線程:

Thread.currentThread() 

如果它是主線程,則某些內在錯誤;這可能是Java本身的問題。如果它是一個線程,請確保它不等待另一個線程完成同步。

+0

謝謝。我使用Jconsole來監視應用程序並檢測死鎖,並且我看不到任何死鎖。 – Kishore 2010-03-15 18:06:11

0

我在Ubuntu有同樣的問題。但在OpenSuse上,它似乎好多了。

可嘗試:

設置反別名和GC的高級選項,如:

gc.setAntialias(SWT.OFF); 
gc.setTextAntialias(SWT.OFF); 
gc.setAdvanced(false); 

,並檢查您正在使用(NVIDIA或ATI IE)商用圖形驅動程序而不是開源驅動程序。

0

Try this或使用的pstacklsstack。當應用程序運行很長時間(或掛起)時,它只是請求您看看它在做什麼。

0

許多人在經常更新小部件時,遇到了Gtk +上SWT應用程序的性能問題(即CPU消耗非常高)。實際的原因似乎是Gtk +。

儘管有些過時,here是對此類性能問題的全面解釋。

您可以嘗試用embedded Swing替換SWT組件,並檢查問題是否仍然可以重現。