JSVC Java守护程序需要性能改进



我已经根据这里的指南成功地将java服务部署到Linux发行版上即实际的简单文件IO tick-tock代码,并且我注意到这种简单程序的高CPU使用率。也许是由于线程不断检查。。。

我已经使用NetBeans在CentOS上构建了实际的JAR文件,然后部署到Arch Linux ARM发行版上,然后使用a)Oracle的Java SE Embedded JVM(v7)和b)Java-7-openjdk JVM。

问题是jsvc的CPU使用率一直在80%到95%之间波动。我没想到CPU会这么高。在实际的jsvc调用中,我尝试为后台进程添加-server参数,但没有成功(我得到了。举个例子会很有帮助,这样我们就可以排除它是否是丢失的-server参数。

我想除了-server选项之外,我可能遗漏了一些东西。我被告知要查看ScheduledExecutiorService——这可能会有所改进?

感谢您的想法-谢谢。

因此,根据nos的建议,我添加了线程暂停,它解决了这个问题。代码如下:

@Override
public void run() {                 
while(!stopped){
long now = System.currentTimeMillis();
if(now - lastTick >= 10000){
System.out.println(!lastOneWasATick ? "tick" : "tock");
lastOneWasATick = !lastOneWasATick;
lastTick = now; 
}
//ADDED THIS BLOCK
try {
Thread.sleep(15000);
} catch (InterruptedException ex) {
//Logger.getLogger(JDaemon.class.getName()).log(Level.SEVERE, null, ex);
}
//END BLOCK
}
}

根据您正在做的操作,Thread.sleep方法可能不错,但我仍然建议使用ScheduledExecutiorService.scheduleAtFixedRate()方法。它经过了彻底的测试和文档记录,其他可能需要在未来维护代码的开发人员应该熟悉它。它还提供了取消执行和管理多个任务的方法。我会仔细看一看。

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import static java.util.concurrent.TimeUnit.*;
public class Clock {
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
private boolean lastOneWasATick = false;
public void startClock() {
//Define the task 
final Runnable tickTock = new Runnable() {
public void run() {
System.out.println(!lastOneWasATick ? "tick" : "tock");
lastOneWasATick = !lastOneWasATick;
}
};      
//Schedule the task's execution at 1 second intervals, starting immediately
final ScheduledFuture<?> tickTockThreadHandle = scheduler.scheduleAtFixedRate(tickTock, 0, 1, SECONDS);
//Stop the clock after 1 minute
scheduler.schedule(new Runnable() {
public void run() {
tickTockThreadHandle.cancel(true);
}
}, 60, SECONDS);
}
}