Use JVM profilers plus Clojure-aware tooling to see CPU time, allocations, and blocking.
Profiling on the JVM is a superpower you already have. The key shift in Clojure is learning how to interpret stacks that include Clojure functions, persistent collections, laziness, and sometimes reflection.
This section focuses on practical profiling workflows (sample profiles, allocation profiles, and “what is blocking?” analysis) and how to avoid misleading results (cold JVM, unrealistic input sizes, or profiling only microbenchmarks).
You will also see how Clojure tooling complements JVM tooling: fast microbenching for tight loops, and Clojure-aware profilers when you need better attribution in idiomatic code.