Skip to Main Content
Instrumentation-based profiling provides a number of benefits, but can also cause high performance overhead. The negative impact of this overhead could be mitigated considerably if only a small part of the target application (e.g. one that has previously been identified as a bottleneck) is instrumented, possibly for a short time only, while the rest of the application code runs at full speed. In this paper we present an experimental profiling system called JFluid, which includes a modified Java™ VM and a GUI tool, and addresses both of the above issues. Our tool supports dynamic instrumentation of a group of methods defined as an arbitrary "root" method plus all methods that it calls (a call subgraph). Methods that belong to a call subgraph are revealed and instrumented lazily, to minimise the number of methods instrumented unnecessarily. Measurements that we obtain when performing full and partial program profiling show that the overhead can be reduced substantially using this technique, and that it is more beneficial when used for large server-side Java applications as opposed to small benchmarks.