2014-02-16 3 views
2

Я успешно развернул Java-службу в дистрибутиве Linux на основе руководства here т. Е. Фактического простого файла ввода-вывода IO-кода и замечаю, что для такой простой программы большое использование ЦП. Возможно, из-за постоянной проверки потока ...Улучшение производительности, требуемое для JSVC Java Daemon

Я создал фактический JAR-файл на CentOS, используя NetBeans, а затем развернул его на ARM-дистрибутив Arch Linux, а затем использовал a) Java SE Embedded JVM (v7) и b) java-7-openjdk JVM.

Проблема в том, что использование ЦП постоянно колеблется от 80 до 95% от jsvc. Я бы не ожидал, что процессор достигнет этого максимума. В фактическом вызове jsvc я попытался добавить параметр -server для фонового процесса, но мне не удалось (я получаю). Пример для этого был бы полезен, поэтому мы могли бы исключить, является ли это отсутствующим параметром -server или нет.

Я думаю, что может быть что-то отсутствует кроме -Server вариант Я сказал, чтобы посмотреть на ScheduledExecutorService. - что может сделать улучшение возможно

Ваши мысли приветствуются -. Благодаря

+0

Вы должны изменить свой подход, пытаясь найти ручку, которая может отключить использование ЦП, выяснить, что и почему использование ЦП является высоким. Это может быть так же просто, как и код с ошибкой, особый неэффективный внутренний цикл или просто медленный процессор. – nos

+0

Спасибо за подсказку. Я не уверен, что находится под капотом jsvc, и я предоставил ссылку на фактический код демона. Я подозреваю, что поток постоянно проверяет файл на последний tick/tock перед добавлением другого (while (! Stop) {...} loop). Итак, (a) мне нужно проверить, если это так, и (б) любая небольшая оптимизация помогает - поэтому с точки зрения настройки, т. Е. Используемые JVM и фактические переданные параметры, такие как -сервер/-клиент или, возможно, размер кучи, должны иметь (даже если оно меньше). Исходя из вышесказанного, будут оценены мнения о наилучшей практике в отношении того, как это сделать должным образом. –

+0

, если вы используете фактический код там, он содержит бесконечный цикл, который вращает процессор так быстро, как только может. Я бы сделал Thread.Sleep (1000); вызовите метод run(). – nos

ответ

1

Так по предложению 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 
      } 

     } 
1

В зависимости от того, что вы делаете, метод 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); 
    } 
} 
+0

Cheers снова Шелдон;) –

Смежные вопросы