JSVC Java守护程序需要性能改进
我已经根据指南成功地将java服务部署到Linux发行版上 i、 e.实际的简单文件IO滴答作响的代码,我注意到这样一个简单程序的CPU使用率很高。也许是因为线程不断检查 我使用NetBeans在CentOS上构建了实际的JAR文件,然后部署到Arch Linux ARM发行版上,然后使用a)Oracle的Java SE嵌入式JVM(v7)和b)Java-7-openjdk JVM 问题是jsvc的CPU使用率一直在80%到95%之间摇摆。 我没想到CPU会那么高。在实际的jsvc调用中,我尝试为后台进程添加-server参数,但没有成功(我得到)。举个例子会很有帮助,这样我们就可以排除是否缺少-server参数 我想除了-server选项之外,我可能还遗漏了一些东西。我被告知要查看ScheduledExecutorService,这可能会有所改进JSVC Java守护程序需要性能改进,java,multithreading,daemon,scheduledexecutorservice,jsvc,Java,Multithreading,Daemon,Scheduledexecutorservice,Jsvc,我已经根据指南成功地将java服务部署到Linux发行版上 i、 e.实际的简单文件IO滴答作响的代码,我注意到这样一个简单程序的CPU使用率很高。也许是因为线程不断检查 我使用NetBeans在CentOS上构建了实际的JAR文件,然后部署到Arch Linux ARM发行版上,然后使用a)Oracle的Java SE嵌入式JVM(v7)和b)Java-7-openjdk JVM 问题是jsvc的CPU使用率一直在80%到95%之间摇摆。 我没想到CPU会那么高。在实际的jsvc调用中,我尝试
非常感谢您的想法-谢谢。因此,我添加了线程暂停,解决了问题。代码如下:
@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方法可能还可以,但我仍然建议使用ScheduledExecutorService.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);
}
}
导入java.util.concurrent.Executors;
导入java.util.concurrent.ScheduledExecutorService;
导入java.util.concurrent.ScheduledFuture;
导入静态java.util.concurrent.TimeUnit.*;
公课钟{
private final ScheduledExecutorService scheduler=Executors.newScheduledThreadPool(1);
私有布尔值lastOneWasATick=false;
公共无效StartLock(){
//定义任务
final Runnable tickTock=new Runnable(){
公开募捐{
System.out.println(!lastOneWasATick?“勾选”:“tock”);
lastOneWasATick=!lastOneWasATick;
}
};
//以1秒的间隔计划任务的执行,立即开始
final ScheduledFuture tickTockThreadHandle=scheduler.scheduleAtFixedRate(tickTock,0,1,秒);
//1分钟后停止计时
scheduler.schedule(新的Runnable(){
公开募捐{
ticktocThreadHandle.cancel(true);
}
},60秒);
}
}
你应该改变你的方法,从寻找一个可以降低CPU使用率的旋钮,到找出CPU使用率高的原因和原因。这可能很简单,比如代码有一个bug,一个特别低效的内环,或者仅仅是处理器太慢慢。感谢提示号。我不确定jsvc的引擎盖下是什么,我提供了实际守护程序代码的链接。我怀疑线程在添加另一个(while(!stopped){…}循环)之前一直在检查文件的最后一个滴答声。因此(a)我需要验证是否是这种情况,以及(b)任何一点优化都会有所帮助——因此在设置方面,即使用的JVM和传递的实际参数,例如-server/-client或堆大小,都会产生影响(即使更小).基于以上,我们将非常感谢您对如何正确执行此操作的最佳实践的看法。如果您使用的是实际代码,它包含一个无限循环,可以使CPU尽可能快地旋转。我将执行Thread.Sleep(1000);在run()方法中调用。事实上!:)当添加到run()方法中时,这实际上起到了作用,特别是在while循环中。谢谢只要我有足够的学分,我会尽快公布答案。再次干杯谢尔顿;)