2015-06-29 2 views
1

У меня есть метод com.acmesoftware.shared.AbstractDerrivedBean.getDerivedUniqueId(). Когда я JProfiler приложение, этот метод getDerivedUniqueId(), по сути, похоронил 80 методов, как ожидалось. Метод вызывается от имени каждого компонента в приложении. Я пытаюсь записать calltree CPU, начиная с этого метода, до листового узла (т. Е. Одного из исключенных классов).Как ограничить JProfiler до поддерева

Я попытался следующие, но это не дало ожидаемого результата:

  1. Найти метод выше методом целевой для профилирования, например, markForDeletion().
  2. набор триггером для начала записи на getDerivedUniqueId()
  3. шнеллером, чтобы остановить запись на markForDeletion()

я ожидал только увидеть все ниже markForDeletion(), но я видел все, вплоть до, но не ВКЛЮЧАЯ getDerivedUniqueId(), что является противоположностью моей намеченной цели. Хуже того, даже с отбором 5 мс этот триггер увеличил предыдущее время работы с 10 минут до «Я прекратил работу через 3 часа». Кажется, что триггер добавляет огромное количество накладных расходов сверху накладных расходов. Следовательно, даже если я выясню, как правильно включить триггер, добавленные накладные расходы, похоже, окажут его неэффективным.

Причина, по которой мне нужно ограничить запись только этим методом: При запуске в режиме выборки 5 мс приложение завершается через 10 минут. Когда я запускаю его в полном оснащении, я ждал 3 часа, и он все еще не завершен. Следовательно, мне нужно включить полную проверку инструмента только после того, как getDerivedUniqueId() вызывается и приостанавливает профилирование при выходе из getDerivedUniqueId().

- Обновлено/Отредактировано: Спасибо Инго Кегелю за вашу помощь. Я, вероятно, не понимаю, как использовать триггеры. В приведенном ниже коде я устанавливаю триггеры, как показано после кода. Мое ожидание заключается в том, что когда я создаю приложение (как выборочное, так и полное) с помощью приведенных ниже триггеров, если логическое значение isCollectMetrics ложно, я должен увидеть 100% или 99,9% процессора в фильтрах. Однако это не так. Кажется, что дерево CPU не учитывает триггеры. Во-вторых, когда isCollectMetrics истинно, дерево вызовов jprofiler, которое я ожидаю, будет начинаться с startProfiling() и заканчиваться на stopProfiling(). Опять же, это тоже не так.

Метод содержит() является узким местом. В итоге он вызывает один из 150 getDerivedUniqueId(). Я пытаюсь определить, какой getDerivedUniqueId() вызывает ухудшение производительности.

public static final AtomicLong doEqualContentTime = new AtomicLong(); 
public static final AtomicLong instCount = new AtomicLong(); 

protected boolean contentsEqual(final InstanceSetValue that) { 

    if (isCollectMetrics) { 

     // initialization code removed for clarity 
     // .......... 
     // .......... 

     final Set<Instance> c1 = getReferences(); 
     final Set<Instance> c2 = that.getReferences(); 
     long st = startProfiling(); /// <------- start here 
     for (final Instance inst : c1) { 
      instCount.incrementAndGet(); 
      if (!c2.contains(inst)) { 
       long et = stopProfiling(); /// <------- stop here 
       doEqualContentTime.addAndGet(et - st); 
       return false; 
      } 
     } 

     long et = stopProfiling(); /// <------- stop here 
     doEqualContentTime.addAndGet(et - st); 
     return true; 
    } else { 
     // same code path as above but w/o the profiling. code removed for bravity. 
     // ...... 
     // ...... 
     return true; 
    } 
} 

public long startProfiling() { 
    return System.nanoTime(); 
} 

public long stopProfiling() { 
    return System.nanoTime(); 
} 

public static void reset() { 
    doEqualContentTime.set(0); 
    instCount.set(0); 
} 

Включенные Триггеры: enter image description here

startProfiling триггерные: enter image description here

stopProfiling триггер: enter image description here

Я пытался 'Start Recordings' или кнопки 'Record CPU' отдельно только для захвата дерева вызовов enter image description here

ответ

0

Если накладные расходы с инструментами большие, вы должны уточнить фильтры.С хорошими фильтрами, накладные приборы могут быть очень маленькими,

Что касается установки триггера, правильные действия:

  1. «Начать запись» с данными CPU выбранных
  2. «Подождите, пока событие в финиш "
  3. « Остановить запись »с выбранными данными CPU
+0

Hi. Я не понимаю вашего предложения. Разве эти шаги не похожи на то, что вы предлагаете. Можете ли вы представить подробные шаги, чтобы сузить инструментарий только до calltree, начиная с getDerivedUniqueId() и завершить задачу в разумные сроки. Благодарю. – user2943574

+0

У вас есть точные действия в вашем триггере, как я предложил? Я не вижу этого на вашем снимке экрана. Я сделал подробные шаги для того, что вы хотите сделать. Улучшение ваших фильтров - это не то, что я могу сделать без подробных сведений о вашем приложении. –

+0

Hi Ingo. Спасибо вам за помощь. Я обновил вопрос, включив код и снимок JProfiler. Я не могу включить дерево вызовов, поскольку оно принадлежит компании. Могу ли я отправить по электронной почте/skype вам скриншот дерева вызовов jprofiler? Спасибо. – user2943574