分配检测器是一个使用 java.lang.instrument API 和 ASM 编写的 Java 代理。它会检测你的 Java 程序中的每个分配;用户定义的回调会在每次分配时被调用。
如何获取
最新版本可从 Maven Central 获取,配置如下:
<dependency>
<groupId>com.google.code.java-allocation-instrumenter</groupId>
<artifactId>java-allocation-instrumenter</artifactId>
<version>3.3.4</version>
</dependency>
基本用法
要编写自己的分配跟踪代码,你需要实现 Sampler
接口,并将其实例传递给 AllocationRecorder.addSampler()
:
AllocationRecorder.addSampler(new Sampler() {
public void sampleAllocation(int count, String desc, Object newObj, long size) {
System.out.println("我刚刚分配了对象 " + newObj +
",类型为 " + desc + ",大小为 " + size);
if (count != -1) { System.out.println("这是一个大小为 " + count + " 的数组"); }
}
});
你还可以使用分配检测器来检测特定类的构造函数。通过实例化一个 ConstructorCallback
并将其传递给 ConstructorInstrumenter.instrumentClass()
来实现:
try {
ConstructorInstrumenter.instrumentClass(
Thread.class, new ConstructorCallback<Thread>() {
@Override public void sample(Thread t) {
System.out.println("正在实例化一个线程");
}
});
} catch (UnmodifiableClassException e) {
System.out.println("无法修改该类");
}
有关如何获取或使用分配检测器的更多信息,请参阅 入门指南。