Время начала и окончания метода приложения Java Flight Recorder - PullRequest
0 голосов
/ 13 мая 2018

Меня интересует, возможно ли получить начальное и конечное время в наносекундах для каждого или большинства пользовательских методов профилирования с помощью программы JFR?

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

У меня есть ощущение, что это должно быть возможно, так как я считаю, что JFR нужна эта информация для оценки процента горячих методов, но нене знаю, как получить это время.Может ли кто-нибудь помочь?

1 Ответ

0 голосов
/ 13 мая 2018

Невозможно получить это, используя JFR.

Поскольку это профилировщик выборки, он будет собирать только тот метод, который был на вершине стека, когда бралась выборка. Вы можете получить метку времени высокой точности, когда она произошла, но она не скажет вам, как долго выполняется метод.

Вот программа, которая показывает, как строится гистограмма.

try (RecordingFile f = new RecordingFile(Paths.get("recording.jfr"))) {
   Map<String, SimpleEntry<String, Integer>> histogram = new HashMap<>();
   int total = 0;
   while (f.hasMoreEvents()) {
     RecordedEvent event = f.readEvent();
     if (event.getEventType().getName().endsWith(".ExecutionSample")) {
       RecordedStackTrace s = event.getStackTrace();
       if (s != null) {
         RecordedFrame topFrame= s.getFrames().get(0);
         if (topFrame.isJavaFrame())  {
           RecordedMethod method = topFrame.getMethod();
           String methodName = method.getType().getName() + "#" + method.getName() + " " + method.getDescriptor();
           Entry entry = histogram.computeIfAbsent(methodName, u -> new SimpleEntry<String, Integer>(methodName, 0));
           entry.setValue(entry.getValue() + 1);
           total++;
         }
       }
     }
   }
   List<SimpleEntry<String, Integer>> entries = new ArrayList<>(histogram.values());
   entries.sort((u, v) -> v.getValue().compareTo(u.getValue()));
   for (SimpleEntry<String, Integer> c : entries) {
     System.out.printf("%2.0f%% %s\n", 100 * (float) c.getValue() / total, c.getKey());
   }
   System.out.println("\nSample count: " + total);
 } 
...