The Allocation Instrumenter is a Java agent written using the java.lang.instrument API and ASM. Each allocation in your Java program is instrumented; a user-defined callback is invoked on each allocation.
The latest release is available from Maven Central as:
<dependency>
<groupId>com.google.code.java-allocation-instrumenter</groupId>
<artifactId>java-allocation-instrumenter</artifactId>
<version>3.3.0</version>
</dependency>
In order to write your own allocation tracking code, you have to implement the Sampler
interface
and pass an instance of that to AllocationRecorder.addSampler()
:
AllocationRecorder.addSampler(new Sampler() {
public void sampleAllocation(int count, String desc, Object newObj, long size) {
System.out.println("I just allocated the object " + newObj +
" of type " + desc + " whose size is " + size);
if (count != -1) { System.out.println("It's an array of size " + count); }
}
});
You can also use the allocation instrumenter to instrument constructors of particular classes.
You do this by instantiating a ConstructorCallback
and passing it to
ConstructorInstrumenter.instrumentClass()
:
try {
ConstructorInstrumenter.instrumentClass(
Thread.class, new ConstructorCallback<Thread>() {
@Override public void sample(Thread t) {
System.out.println("Instantiating a thread");
}
});
} catch (UnmodifiableClassException e) {
System.out.println("Class cannot be modified");
}
For more information on how to get or use the allocation instrumenter, see Getting Started.