2012-10-12 50 views
1

我有一臺Swing GUI應用程序在〜150臺計算機(每臺配置相同)的WinXP上運行。Java串行端口寫入將CPU使用率提高到100%

但是在其中一些應用程序(如5)上,當應用程序嘗試通過RXTX(pos打印機)與串行端口通信時,java cpu使用率上升到接近100%,因此阻塞了整個機器。

此串行端口上的寫入是在特定的線程中完成的。其中之一是這樣的:

... queries on the hsql database 
... writing results in a byte array called "stream" 

CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier("COM2"); 
serialPort = (SerialPort) portId.open("Sending", 2000); 
serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); 

OutputStream out = serialPort.getOutputStream(); 
out.write(stream); 
out.close(); 
serialPort.close(); 

我首先想到有一個與查詢問題寫之前,但我的應用程序做了很多其他線程的查詢,這兒有沒有這樣的問題。

在這些計算機上,打印時間是可變的(最多10分鐘,機器被阻塞)。在其他計算機上,打印在2秒內完成,而不會提高CPU使用率。

你有什麼想法可以解決這個問題嗎?

+0

嘗試從命令行直接打印到打印機以排除系統問題。 – PeterMmm

+0

你捕獲PortInUseException嗎?我可以從上面的代碼想象出,'out.write'塊,因爲打印機沒有「關注」? – Fildor

+0

是的抱歉,我沒有粘貼我的所有代碼,但我抓到了PortInUse,UnsupportedComOperation和NoSuchPort,這些都沒有拋出。 – caRameL

回答

0

建議 檢查波特率允許用於服務器和工作站 檢查硬件RAM的數量發送機器 檢查多少RAM的Java允許在JRE配置面板 檢查與反病毒

0

嘗試在使用率高的CPU正在發生的情況下,您的應用程序將在VisualVM(包含在Java發行版(1.6和更高版本)中)中進行分析。 (您可以連接到正在運行的JVM來對其進行分析。)

這將告訴您哪個函數或庫調用正在使用您的CPU,因此您可以優化或修復代碼(如果它是您的代碼導致它)或識別行爲不當的圖書館。

在Debian/Ubuntu上,您可以從visualvm包中獲得VisualVM。請注意,無論出於何種原因,運行它的命令是jvisualvm

+0

我會嘗試,謝謝你的軟我不知道它。但正如我所說,我的問題只出現在幾臺電腦上,所以我相信如果這是我的代碼,問題會出現在每臺電腦上。 – caRameL

+0

@caRameL:它也可以幫助識別錯誤是硬件還是錯誤庫。 –