A test bench: how far can one get with dynamic analysis of Java code by
assembling existing free tools? The pages below are the result.
1It slots into a run
You hand it the command and it launches it as it is:
--java "java -jar my-app.jar". Nothing to change in the code nor in the
build — the observers come in through JAVA_TOOL_OPTIONS, which every
JVM reads at start-up. On a JVM one does not launch oneself (service, container),
--print-options hands over the line to paste.
2Three tools observe
JaCoCo records the lines executed, async-profiler measures the time, Arthas captures
the values received. Each produces its own report, in its own format.
3Their outputs are brought together
The three reports are aggregated into a single view: one page to read rather
than three formats to reconcile oneself.
What follows comes from real runs: a travel-time calculator (27 classes,
9 packages, plus one dependency analysed from its jar), under Java 25. Every page below
is a tool's output, not a screenshot.
None of these three tools answers on its own. Coverage ignores time and values; the
profile samples, so it never proves that some code did not run; inspecting values
looks at one named method only. It is their combination that answers — and that is what the
aggregated view assembles.