我在~150台计算机上运行WinXP的Swing GUI应用程序(每台计算机配置相同)。
但是对于其中一些(如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 :(得分:0)
建议 检查服务器和工作站允许的波特率 检查发送机器具有的硬件RAM数量 检查jre配置面板中允许多少RAM Java 检查防病毒
答案 1 :(得分:0)
尝试在VisualVM中分析您的应用程序,该程序包含在Java发行版(1.6及更高版本)中,同时CPU使用率很高。 (您可以连接到正在运行的JVM以对其进行分析。)
这将告诉您哪个函数或库调用正在使用您的CPU,因此您可以优化或修复您的代码(如果它是您的代码导致它)或识别行为不端的库。
在Debian / Ubuntu上,您可以从visualvm
包中获取VisualVM。请注意,无论出于何种原因,运行它的命令都是jvisualvm
。