Traditional Java profilers use either byte code instrumentation or sampling (taking stack traces at short intervals) to determine where time was spent. Both approaches add their own skews and oddities. Understanding the output of those profilers is an art of its own and requires quite some experience. Fortunately, Brendan Gregg, a performance engineer at Netflix, came up with flame graphs (see htt