我启动一个jar文件作为守护进程。它是一个简单的扫描应用程序,运行扫描文件夹的线程。我使用睡眠60000ms,所以如果我在我的Mac上运行应用程序,cpu使用率接近0%。
如果我在我的32b Ubuntu服务器上运行jar作为守护进程,它在空闲时消耗100%cpu(例如,它扫描的文件夹中没有文件)。
sudo start-stop-daemon --start --quiet -b -m --pidfile /var/run/filecom.pid --exec /usr/bin/java -- -Xms128m -Xmx128m -jar /apps/FileCom/filecom.jar
我做错了什么?
由于
修改
我做一个Thread.sleep(60000)。当我不将它作为守护进程运行时,它不会消耗那么多的CPU。我的猜测是它与我的守护进程有关。
public void run()
{
//Create our root folder (folder to scan)
File root = new File(rootFolder);
//Start the loop
while(true)
{
//List all files in the root folder
File[] filesInRoot = root.listFiles();
Arrays.sort( filesInRoot, new Comparator<Object>()
{
public int compare(Object o1, Object o2)
{
if (((File)o1).lastModified() < ((File)o2).lastModified())
{
return -1;
}
else if (((File)o1).lastModified() > ((File)o2).lastModified())
{
return +1;
}
else
{
return 0;
}
}
});
//If there are no files in the target folder then move the first file in the array
if(filesInRoot.length>0)
{
LogUtil.write(">> Finds file in in queue: " + filesInRoot[0].getName());
//Check that the file has been written, EOF
if(checkEOF(filesInRoot[0]))
{
LogUtil.write(">> File is complete, preparing to move");
//Rename the file using time and date - to make it unique
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
Long time = cal.getTimeInMillis();
String fileprefix = sdf.format(cal.getTime())+time.toString();
String processFileName = fileprefix+"_"+filesInRoot[0].getName();
//Move the file and rename it
File processFile = new File(processFolder, processFileName);
boolean success = filesInRoot[0].renameTo(processFile);
if (success)
{
LogUtil.write(">> Success: File was moved to "+processFolder);
LogUtil.write(">> Processing....");
try
{
//Do stuff
}
catch (Exception e) //Handles all errors
{
LogUtil.write(e);
}
finally
{
//Create backup of the infile (outfile is bupped in writeResponseObject)
File bupInFile = new File(bupFolder+"/in", processFileName);
processFile.renameTo(bupInFile);
LogUtil.write(">> inFile backed up: "+bupInFile.getAbsolutePath());
}
}
else
{
LogUtil.write(">> Failure: File could not be moved ");
}
}
else
{
LogUtil.write(">> Failure: file is still beeing written...");
}
try
{
Thread.sleep(FileCom.PROSchedule);
}
catch (InterruptedException ie)
{
ie.printStackTrace();
}
}
}
答案 0 :(得分:1)
查看代码,大括号不完全匹配,看起来如果文件夹中有文件,你只是在睡觉。
尝试将守护程序代码与文件夹中的文件一起使用,看看CPU使用率是否仍然高峰。
此外,如果您对代码使用适当的缩进,它会有所帮助。
答案 1 :(得分:0)
首先,如果您发布实际执行文件夹扫描的代码,将会有所帮助。这些API在每个操作系统的VM中都有非常不同的实现,因此您遇到不同的行为并不罕见。
其次,你的代码是一个连续的循环而没有在Java中完成任何线程休眠吗?如果是这样,这不是很好。你应该给你的代码睡眠/产生时间,你应该用Java而不是命令行来做,这样VM就可以正确地通过操作系统调度程序进行线程调度等。
无论如何,你在OS / X上获得更好的CPU使用率的原因可能与该操作系统的积极抢占有关,这不会让任何没有做任何“有用”的事情占用CPU。
答案 2 :(得分:0)
---发布代码后编辑---
您的问题出在此行代码块
中 if(filesInRoot.length>0) {
... a lot of stuff goes here ...
try
{
Thread.sleep(FileCom.PROSchedule);
}
catch (InterruptedException ie)
{
ie.printStackTrace();
}
}
所以,如果filesInRoot.length == 0
你不能睡觉。
你需要像这样重新安排代码
if (filesInRoot.length > 0) {
... a lot of stuff goes here ...
}
try {
Thread.sleep(FileCom.PROSchedule);
} catch (InterruptedException ie) {
ie.printStackTrace();
}
---原帖如下---
也许您做出的假设对MacOSX有效但在Ubuntu中失败。谁知道,您可能处于100%CPU状态,因为您从未输入sleep(...)
所在的代码块。
源代码非常适合对此类主题进行相关讨论。没有它,一切都变成了猜谜游戏。我们很多人都善于猜测,但我们不喜欢这样做。它太容易出错,我们希望保持至少试图提供有用帮助的声誉。
尝试将相关代码放在一个非常小的示例程序中。在完成示例之前,您最多可以发现并解决自己的问题。在最坏的情况下,您将有一个不同行为的工作示例,这将允许其他人为您提供有意义的相关解决方案。