BTrace跟蹤DBCP泄漏腳本
import static com.sun.btrace.BTraceUtils.println;
import static com.sun.btrace.BTraceUtils.str;
import static com.sun.btrace.BTraceUtils.strcat;
import static com.sun.btrace.BTraceUtils.timeMillis;
import java.sql.Connection;
import java.util.HashMap;
import java.util.Map;
import com.sun.btrace.BTraceUtils;
import com.sun.btrace.annotations.BTrace;
import com.sun.btrace.annotations.Kind;
import com.sun.btrace.annotations.Location;
import com.sun.btrace.annotations.OnMethod;
import com.sun.btrace.annotations.ProbeClassName;
import com.sun.btrace.annotations.ProbeMethodName;
import com.sun.btrace.annotations.Return;
import com.sun.btrace.annotations.OnEvent;
import com.sun.btrace.annotations.Self;
import com.sun.btrace.annotations.TLS;
import java.lang.Appendable;
@BTrace public class DataSourceTrace {
private static Map map = BTraceUtils.newHashMap();
@OnMethod(clazz = "org.apache.commons.dbcp.BasicDataSource", method = "getConnection", location = @Location(Kind.RETURN))
public static void traceExecute(@ProbeClassName String name,@ProbeMethodName String method, @Return Connection conn) {
//BTraceUtils.println(strcat("獲取連接:",BTraceUtils.str(conn)));
Appendable buffer=BTraceUtils.Strings.newStringBuilder();
BTraceUtils.Strings.append(buffer,BTraceUtils.timestamp("yyyy-MM-dd HH:mm:ss"));
BTraceUtils.Strings.append(buffer," - ");
BTraceUtils.Strings.append(buffer,BTraceUtils.jstackStr());
BTraceUtils.put(map, conn,str(buffer));
}
@OnMethod(clazz = "org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper", method = "close")
public static void traceExecute2(@ProbeClassName String name,@ProbeMethodName String method, @Self Connection conn) {
//BTraceUtils.println(strcat("釋放連接:",BTraceUtils.str(conn)));
BTraceUtils.remove(map, conn);
}
@OnEvent
public static void exit(){
//這里打印泄漏連接的方法堆棧,運行一段時間后通過Ctrl+C,選擇2,發送事件打印
BTraceUtils.printMap(map);
}
}