Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSVC Java守护程序需要性能改进_Java_Multithreading_Daemon_Scheduledexecutorservice_Jsvc - Fatal编程技术网

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

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调用中,我尝试

我已经根据指南成功地将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,这可能会有所改进


非常感谢您的想法-谢谢。

因此,我添加了线程暂停,解决了问题。代码如下:

        @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循环中。谢谢只要我有足够的学分,我会尽快公布答案。再次干杯谢尔顿;)