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

Posted

技术标签:

【中文标题】无法在 Windows 10 上运行作为服务运行的 Java 应用程序的 Continuous Flight Recorder【英文标题】:Unable to run Continuous Flight Recorder for Java app running as a service on Windows10 【发布时间】:2018-02-19 16:10:19 【问题描述】:

我正在尝试使用 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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

我已经更新了跟踪级别日志的描述。停止服务时,我看不到任何跟踪或调试日志。我注意到另一种行为,临时文件未在临时目录中生成。这是随机行为。有时 Temp 目录包含 .jfr 文件(0KB)以及服务结束时的 .jfr.part 文件(463KB)。所以在某种程度上,数据被捕获但没有转储到文件中。 我认为这是一个权限问题,您无法写入 C:\。尝试将文件名设置为临时目录(进程可以访问的地方)。如果这不起作用,可能是因为该进程被过早终止。如果进程有机会运行关闭挂钩,则 JVM 不应将 .part 和 .jfr 文件留在临时目录中。 我无法弄清楚为什么它没有创建文件。最后,我通过将 Service 转换为 App 来实现它。

以上是关于无法在 Windows 10 上运行作为服务运行的 Java 应用程序的 Continuous Flight Recorder的主要内容,如果未能解决你的问题,请参考以下文章

当 XAMPP 作为服务运行时,页面无法连接 ODBC 服务器(在 Windows Server 2008 上)

应用Windows 10 Creators Update后,CouchDB无法启动

C# Windows 窗体无法在 Windows10 上加载非托管 C++ DLL

适用于 Windows 8.1 的 Nvidia GeForce 驱动程序无法在 Windows 10 上运行 [关闭]

xampp中的phpmyadmin无法在Windows 10上运行

Virtualbox Ubuntu Nginx 无法在 Windows 10 上运行 [关闭]