Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.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
Java飞行记录器应用方法开始和结束时间_Java_Jfr - Fatal编程技术网

Java飞行记录器应用方法开始和结束时间

Java飞行记录器应用方法开始和结束时间,java,jfr,Java,Jfr,我感兴趣的是,在使用JFR程序进行评测时,是否有可能以纳秒为单位获得每个或大多数用户方法的开始和结束时间 我知道可以使用代码插装,但我想利用采样探查器的优势来减少对实际程序执行的影响 我有一种感觉,这应该是可能的,因为我相信JFR需要热方法百分比评估的信息,但不知道如何获得时间。 有人能帮忙吗?使用JFR是不可能的 因为它是一个采样分析器,所以它只会收集采样时堆栈顶部的方法。当它发生时,您可以得到一个高精度的时间戳,但它不会告诉您该方法执行了多长时间 下面是一个显示直方图是如何构建的程序 try

我感兴趣的是,在使用JFR程序进行评测时,是否有可能以纳秒为单位获得每个或大多数用户方法的开始和结束时间

我知道可以使用代码插装,但我想利用采样探查器的优势来减少对实际程序执行的影响

我有一种感觉,这应该是可能的,因为我相信JFR需要热方法百分比评估的信息,但不知道如何获得时间。
有人能帮忙吗?

使用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);
 } 
try(RecordingFile f=new RecordingFile(path.get(“recording.jfr”)){
映射直方图=新的HashMap();
int-total=0;
而(f.hasMoreEvents()){
RecordedEvent事件=f.readEvent();
if(event.getEventType().getName().endsWith(“.ExecutionSample”)){
RecordedStackTrace s=event.getStackTrace();
如果(s!=null){
RecordedFrame topFrame=s.getFrames().get(0);
if(topFrame.isJavaFrame()){
RecordedMethod=topFrame.getMethod();
String methodName=method.getType().getName()+“#”+method.getName()+”“+method.getDescriptor();
Entry=histogram.computeIfAbsent(methodName,u->newSimpleEntry(methodName,0));
entry.setValue(entry.getValue()+1);
总计++;
}
}
}
}
列表条目=新的ArrayList(histogram.values());
条目.sort((u,v)->v.getValue().compareTo(u.getValue());
for(SimpleEntry c:条目){
System.out.printf(“%2.0f%%%s\n”,100*(float)c.getValue()/total,c.getKey());
}
System.out.println(“\n样本计数:“+总数”);
}