java - 无法在 Windows 10 上运行作为服务运行的 Java 应用程序的 Continuous Flight Recorder

标签 java windows profiling jmc jfr

我正在尝试使用 Java 飞行记录器 dumponexit 分析一个 Java 应用程序,该应用程序在 Windows 10(64 位)中作为服务运行。选项。在执行过程中,Windows 会创建临时目录和临时 .jfr 文件。但是,最终的 JFR 文件不是在默认目录或用户定义的目录中创建的。 使用的确切选项是 -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:FlightRecorderOptions=defaultrecording=true,dumponexit=true .

这组选项在任何使用java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:FlightRecorderOptions=defaultrecording=true,dumponexit=true -jar <AppName>运行的java应用程序上都能完美工作。 .

在另一种情况下,如果我使用-XX:StartFlightRecording选项具有定义的持续时间,然后 Java Flight Recorder 按预期在给定目录中创建文件。使用的确切选项是 -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=delay=20s,duration=60s,name=MyRecording,filename=C:\myrecording.jfr

我的要求是我需要使用前一个选项进行分析。也就是说,每当所述 Windows 服务启动时,就会启用分析,每当服务停止时,分析就会停止并生成 .jfr 文件。

如果有人使用连续录制并解决了这个问题,那么我们将不胜感激。

更新:设置日志级别以跟踪后,会生成以下日志。 使用的选项:-XX:FlightRecorderOptions=defaultrecording=true,dumponexit=true,dumponexitpath=C:\,loglevel=trace

[2018-02-20 10:36:23] [info]  [ 1252] Commons Daemon procrun (1.0.15.0 64-bit) started
[2018-02-20 10:36:23] [info]  [ 1252] Running 'XYZ' Service...
[2018-02-20 10:36:23] [info]  [ 6292] Starting service...
[2018-02-20 10:36:23] [info]  [ 7944] [jfr][INFO ][0.000] 
[2018-02-20 10:36:23] [info]  [ 7944] JFR log level set. Log level now at [TRACE]
[2018-02-20 10:36:23] [info]  [ 7944] [jfr][TRACE][0.163] 
[2018-02-20 10:36:23] [info]  [ 7944] Loaded JFR library
[2018-02-20 10:36:23] [info]  [ 7944] [jfr][INFO ][0.191] 
[2018-02-20 10:36:23] [info]  [ 7944] Using C:\Windows\Temp\2018_02_20_10_36_23_12304 as Flight Recorder repository.
[2018-02-20 10:36:23] [info]  [ 7944] [jfr][TRACE][0.216] 
[2018-02-20 10:36:23] [info]  [ 7944] Default settings loaded.
[2018-02-20 10:36:23] [info]  [ 7944] [jfr][TRACE][0.218] 
[2018-02-20 10:36:23] [info]  [ 7944] Shutdown hook registered
[2018-02-20 10:36:23] [info]  [ 7944] [jfr][TRACE][0.224] 
[2018-02-20 10:36:23] [info]  [ 7944] VMJFR created.
[2018-02-20 10:36:23] [info]  [ 7944] [jfr][TRACE][0.272] 
[2018-02-20 10:36:23] [info]  [ 7944] RedefineClass successful
[2018-02-20 10:36:23] [info]  [ 7944] [jfr][TRACE][0.274] 
[2018-02-20 10:36:23] [info]  [ 7944] RedefineClass successful
[2018-02-20 10:36:23] [info]  [ 7944] [jfr][TRACE][0.277] 
[2018-02-20 10:36:23] [info]  [ 7944] RedefineClass successful
[2018-02-20 10:36:23] [info]  [ 7944] [jfr][TRACE][0.288] 
[2018-02-20 10:36:23] [info]  [ 7944] Java started. Took 127 ms
[2018-02-20 10:36:23] [info]  [ 7944] [jfr][TRACE][0.290] 
[2018-02-20 10:36:23] [info]  [ 7944] Starting up default recording
[2018-02-20 10:36:23] [info]  [13316] [jfr][DEBUG][0.292] 
[2018-02-20 10:36:23] [info]  [13316] Bufferthread started.
[2018-02-20 10:36:23] [info]  [ 7944] [jfr][INFO ][0.427] 
[2018-02-20 10:36:23] [info]  [ 7944] Starting recording [id=0, name=HotSpot default, start=Tue Feb 20 10:36:23 GMT 2018]
[2018-02-20 10:36:23] [info]  [ 7944] [jfr][TRACE][0.429] 
[2018-02-20 10:36:23] [info]  [ 7944] Binding recording [id=0, name=HotSpot default, start=Tue Feb 20 10:36:23 GMT 2018]
[2018-02-20 10:36:23] [info]  [ 7944] [jfr][TRACE][0.431] 
[2018-02-20 10:36:23] [info]  [ 7944] Default recording started
[2018-02-20 10:36:23] [info]  [ 7944] [jfr][TRACE][0.433] 
[2018-02-20 10:36:23] [info]  [ 7944] Finished starting default recording
[2018-02-20 10:36:25] [info]  [ 6292] Service started in 1799 ms.
[2018-02-20 10:37:40] [info]  [ 9208] Stopping service...
[2018-02-20 10:37:42] [info]  [ 9208] Service stop thread completed.
[2018-02-20 10:38:42] [info]  [ 1252] Run service finished.
[2018-02-20 10:38:42] [info]  [ 1252] Commons Daemon procrun finished

最佳答案

我的第一个猜测是它与(文件)权限相关。运行 Windows 服务的用户可能与从 shell 启动 Java 进程时的用户不同。也就是说,当您设置持续时间时,您就能够获得录音,因此该理论不成立。

当您指定 dumponexit=true 时,转储将在 Java 关闭 Hook 中执行。如果进程没有正确终止,即进程被强行终止,则钩子(Hook)将永远没有机会运行。

如果您可以获得日志,我会尝试使用 -XX:FlightRecorderOptions=loglevel=trace 启动它,看看您是否看到任何错误消息。

关于java - 无法在 Windows 10 上运行作为服务运行的 Java 应用程序的 Continuous Flight Recorder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48869967/

相关文章:

java - 从类名生成的 toString() 文本

java - Eclipse 3.4 文本查看器

java - 从 Scanner 获取输入时 Maven 挂起

java - 如何在 Windows 上加快 Java 递归文件搜索速度?

c++ - 进行循环分析的最佳方法

java - 无法使用 jvisualvm 分析 JBoss 5

java - 在不使用任何外部函数的情况下生成随机数

windows - 使用WINAPI找出特殊文件上的进程事件句柄(锁定)

c++ - 如何在 Visual C++ 中复制文件?

c - 在编译时从符号表中获取一个函数名