When using the Linux "perf" tool to do system profiling, symbol names of running Java methods cannot be decoded, resulting in unhelpful output such as:
10.52% [JIT] tid 236748 [.] 0x00007f6fdb75d223 Perf can read a simple text file format describing the mapping between address ranges and symbol names for a particular process [1]. It's possible to generate this already for Java processes using a JVMTI plugin such as perf-map-agent [2]. However this requires compiling third-party code and then loading the agent into your Java process. It would be more convenient if Hotspot could write this file directly using a diagnostic command. The information required is almost identical to that of the existing Compiler.codelist command. This patch adds a Compiler.perfmap diagnostic command on Linux only. To use, first run "jcmd <pid> Compiler.perfmap" and then "perf top" or "perf record" and the report should show decoded Java symbol names for that process. As this just writes a snapshot of the code cache when the command is run, it will become stale if methods are compiled later or unloaded. However this shouldn't be a big problem in practice if the map file is generated after the application has warmed up. [1] https://github.com/torvalds/linux/blob/master/tools/perf/Documentation/jit-interface.txt [2] https://github.com/jvm-profiling-tools/perf-map-agent ------------- Commit messages: - 8254723: add diagnostic command to write Linux perf map file Changes: https://git.openjdk.java.net/jdk/pull/760/files Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=760&range=00 Issue: https://bugs.openjdk.java.net/browse/JDK-8254723 Stats: 149 lines in 5 files changed: 148 ins; 1 del; 0 mod Patch: https://git.openjdk.java.net/jdk/pull/760.diff Fetch: git fetch https://git.openjdk.java.net/jdk pull/760/head:pull/760 PR: https://git.openjdk.java.net/jdk/pull/760