Jvm profiling
Plug-and-play skills and prompts for every AI coding agent
npx -y skills add Amey-Thakur/AI-SKILLS --skill jvm-profilingAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 19 days oldThe repository was created 19 days ago. New is not bad, but a brand new repository carrying a familiar-sounding name is the shape a typosquat arrives in, and there has been no time for anyone else to find a problem with it.
- 4 stars4 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Profile JVM services with async-profiler and JFR, separating CPU, allocation, and lock evidence, safely in production. Use when a JVM service is slow, hot, or memory-hungry and you need the cause.
SKILL.md
3.6 KB, as published. Nobody here has run it
JVM profiling
The JVM ships production-safe profilers; there is no excuse for guessing. The craft is picking the right profile type for the symptom and reading past the framework noise to your code.
Method
- Match the profile to the symptom. High CPU: CPU sampling
(async-profiler
-e cpu, or JFR's execution samples). High GC or heap pressure: allocation profiling (-e alloc, JFR allocation events: sites by rate, feeding jvm-gc-selection's step 4). Slow but idle CPU: wall-clock/off-CPU profiling (-e wall) and lock profiling (-e lock, JFR monitor-blocked events): a service waiting on locks or downstreams shows nothing in CPU samples (the systems-profiling off-CPU rule, JVM edition). - Use the safe tools, even in production. async-profiler and
JFR sample via safepoint-bias-free mechanisms at low overhead
(~1-2%): suitable for production during incidents. Old
instrumenting profilers and
hprof-style tracing distort hot paths and belong nowhere near load. Continuous JFR recordings (ring buffer, dumped on incident) give you the profile of the problem that already happened (see production-debugging). - Read flamegraphs from your frames outward. Framework stacks
(server threads, serialization, logging) dominate visually;
find your packages' widest frames first, then judge the
framework towers: wide JSON serialization means fat DTOs
(see rest-endpoint-design projections), wide logging means
log-level or string-building waste (see log-levels), wide
malloc/GC frames mean allocation churn (see java-collections sizing, memory-optimization). - Correlate with GC and thread state before concluding. A "slow service" profile taken during a GC storm profiles the symptom, not the cause: check GC logs first (see jvm-gc-selection). Thread dumps (three, seconds apart) reveal pool starvation and deadlocks that samples smear (see deadlock-analysis, stack-trace-reading); JFR's thread states put numbers on runnable vs blocked vs waiting.
- Diagnose heap with dumps and dominator trees. For footprint and leaks: heap dump into MAT-class tooling, dominator tree for retained size by root, histogram diff between two dumps for growth (see memory-leaks, jvm-gc-selection step 5). For "what is allocating", the allocation profile beats the heap dump: one shows standing stock, the other flow.
- Benchmark micro-claims with JMH, not loops. JIT warmup, dead-code elimination, and OSR make naive timing loops lie; JMH handles warmup/forking/blackholes (the zero-cost-abstractions verification ethic on the JVM). Macro changes validate under load against SLO metrics (see benchmark-design, load-testing); a micro win that disappears at p99 was noise.
Boundaries
- Profiles are per-workload evidence: staging profiles with fake data mislead on cache hit rates, JIT decisions, and data sizes; prefer production or production-shaped load (see test-environment-parity).
- Native memory (direct buffers, Netty arenas, JNI) escapes heap tools; native memory tracking (NMT) and OS-level maps cover the gap when container RSS exceeds heap math (see kubernetes-workloads memory budgeting).
- Kotlin coroutines and virtual threads restructure stacks; use profiler versions aware of them, or frames attribute to schedulers instead of your code.