准备BTrace
- 下载地址:here
- 找个目录解压
编写BTrace类
import com.sun.btrace.annotations.BTrace;
import com.sun.btrace.annotations.OnMethod;
import static com.sun.btrace.BTraceUtils.*;
@BTrace
public class TraceScript {
@OnMethod(clazz = "java.lang.System", method = "gc")
public static void traceExecute() {
println("who calls System.gc:");
jstack();
}
}
把TraceScript 放在服务器上
运行待排查的程序
查看待排查的程序的pid
#jcmd
2231 jvm.FullGCDemo2
执行TraceScript
#cd /usr/local/tools/btrace-bin-1.3.11.3
#bin/btrace -cp ./build/ 2231 /btrace-test/TraceScript.java
who calls System.gc:
java.lang.System.gc(System.java)
jxl.read.biff.SheetImpl.clear(SheetImpl.java:687)
jxl.read.biff.WorkbookParser.close(WorkbookParser.java:518)
jvm.FullGCDemo2.main(FullGCDemo2.java:24)
上面蓝色字体所显示就是调用System.gc的位置。
总结:BTrace可以追踪知道具体方法的调用,如果不知道具体方法,可以使用谷歌提供的gperftools内存申请工具来排查。