Working with Instrumentation

1. Understanding Java Agent Basics

ConceptDetail
AgentJAR with Premain-Class or Agent-Class
PremainLoaded with -javaagent:agent.jar at startup
AgentmainAttached at runtime via Attach API
CapabilityTransform bytecode of loaded classes

2. Creating Java Agents

Example: Premain agent

public class TimingAgent {
    public static void premain(String args, Instrumentation inst) {
        inst.addTransformer(new TimingTransformer(), true);
    }
}
Manifest AttrUse
Premain-ClassStartup agents
Agent-ClassRuntime-attached
Can-Retransform-Classestrue to retransform
Can-Redefine-Classestrue to redefine

3. Using Instrumentation API

MethodUse
addTransformer(t[, canRetransform])Register transformer
retransformClasses(c...)Re-apply transformers
redefineClasses(defs...)Replace class bytes
getAllLoadedClasses()Snapshot
getObjectSize(obj)Shallow size

4. Transforming Classes (ClassFileTransformer)

Example: Transformer

class TimingTransformer implements ClassFileTransformer {
    public byte[] transform(ClassLoader cl, String name, Class<?> classBeingRedefined,
                            ProtectionDomain pd, byte[] classfileBuffer) {
        if (!name.startsWith("com/acme/")) return null;
        return rewrite(classfileBuffer);
    }
}
ReturnMeaning
nullNo change
byte[]Replacement bytecode

5. Retransforming Classes

AspectDetail
RestrictionCannot add/remove fields, methods, supers
UseModify method bodies after load
Triggerinst.retransformClasses(MyClass.class)

6. Using Byte Buddy for Instrumentation

APIUse
new ByteBuddy().subclass(...)Generate subclass
AgentBuilderFluent transformer DSL
AdviceInject @OnMethodEnter/@OnMethodExit
UseAPM (New Relic, Datadog)

7. Using ASM Library

ComponentUse
ClassReaderParse bytecode
ClassWriterEmit bytecode
ClassVisitor / MethodVisitorVisitor pattern
Tree APIHigher-level node tree

8. Attaching Agents at Runtime

Example: Attach API

VirtualMachine vm = VirtualMachine.attach(pid);
vm.loadAgent("/path/agent.jar", "options");
vm.detach();
AspectDetail
Modulejdk.attach
PermissionSame UID; -XX:+EnableDynamicAgentLoading (Java 21+ warning)

9. Profiling with Agents

ToolMechanism
async-profilerJVMTI + perf_events
YourKit / JProfilerJVMTI agents
JFRBuilt-in low-overhead
APMBytecode instrumentation via ByteBuddy

10. Understanding Security Implications

Warning: Agents can read/modify any code, including security-sensitive classes. Treat agent JARs as fully trusted code. From Java 21, dynamic agent loading triggers a warning; future releases may require -XX:+EnableDynamicAgentLoading.
RiskMitigation
TamperingSign agent JARs, verify provenance
PerformanceMeasure overhead per transformer
StabilityTest transformations against all class shapes