本文共 7761 字,大约阅读时间需要 25 分钟。
上周五接近6个小时都在开会,悲剧阿。 美好的一天又这样被浪费了。
还好开会的时候自带了笔记本,闲来无聊又重新把btrace的内容重新梳理了一遍。
ps : 以前虽然看过btrace的使用,但根本是一种阅读者的态度,并没有反编译btrace源码进行查看。 还有就是实际也没写过几个btrace脚本,很多使用就显得很生疏。所以需要多加强下,只能多看过个2,3遍。
更详细,更精彩的一些btrace内容,请查看:
几个常用url :
1. javadoc文档:
2. UserGuide :
3. DeveloperGuide :
4. jvisualvm plugins : ,
1. Kind.CALL 和 Kind.ENTRY的使用理解
3. @TargetInstance 和 @TargetMethodOrField的理解
这个可以结合Kind.CALL进行说明,如果是probe A class的方法中调用了匹配B class。 @TargetInstance 返回的就是B class的实例,@Self返回的就是A class
1.Please enter your option: 2. 1. exit 3. 2. send an event 4. 3. send a named event
1.@OnEvent 2. public static void event() { 3. println("event"); 4. } 5. 6. @OnEvent("A") // 相应name A event 7. public static void eventA() { 8. println("eventA"); 9. } 10. 11. @OnEvent("B") // 相应name B event 12. public static void eventB() { 13. println("eventB"); 14. }
1.@OnExit 2. public static void onexit(int code) { 3. println("exit"); 4. } 5. 6. @OnTimer(1000) 7. public static void ontime() { 8. println(i++); 9. if (i == 5) { 10. println("do exit"); 11. exit(0); 12. } 13. }
1. 启动,关闭,Event事件发送都挺方便的。
2. 不用每次vi 打开java文件进行编辑,修改script就方便多了
1. Jetty监控request/response buffer,有项目在使用中发现出现http 413错误(Request entity too large) ,
初步怀疑是和buffer参数有关,原先使用jboss的参数为maxHttpHeadSize=8196,所以写了脚本提取了下线上的jetty参数,后面就修改了jetty参数为8k,解决了问题
1.@BTrace 2.public class JettyHeadBufferTracer { 3. 4. @OnMethod(clazz = "org.eclipse.jetty.http.HttpBuffers", method = "/.*get.*Buffers/", location = @Location(value = Kind.ENTRY)) 5. public static void bufferMonitor(@Self Object self) { 6. Field requestBuffersField = field("org.eclipse.jetty.http.HttpBuffers", "_requestBuffers"); 7. Field responseBuffersField = field("org.eclipse.jetty.http.HttpBuffers", "_responseBuffers"); 8. 9. Field bufferSizeField = field("org.eclipse.jetty.io.ThreadLocalBuffers", "_bufferSize"); 10. Field headerSizeField = field("org.eclipse.jetty.io.ThreadLocalBuffers", "_headerSize"); 11. Object requestBuffers = get(requestBuffersField, self); 12. int requestBufferSize = (Integer) get(bufferSizeField, requestBuffers); 13. int requestHeaderSize = (Integer) get(headerSizeField, requestBuffers); 14. Object responseBuffers = get(responseBuffersField, self); 15. int responseBufferSize = (Integer) get(bufferSizeField, responseBuffers); 16. int responseHeaderSize = (Integer) get(headerSizeField, responseBuffers); 17. 18. println(strcat(strcat(strcat("requestBufferSize : ", str(requestBufferSize)), " requestHeaderSize : "), 19. str(requestHeaderSize))); 20. println(strcat(strcat(strcat("responseBufferSize : ", str(responseBufferSize)), " responseHeaderSize : "), 21. str(responseHeaderSize))); 22. } 23.}
1.requestBufferSize : 8192 requestHeaderSize : 6144 2.responseBufferSize : 12288 responseHeaderSize : 6144
2. 项目中使用了dbcp做为数据库连接池,但对于连接池大小是否够用没有很直观的数据可以提供,所以写了个脚本提取一下数据
主要的数据内容:
* maxActive(最大连接池大小),numActive(目前处于使用中),numIdle(处于空闲状态的连接数)
* maxTotal(开启ps的最大值),totalActive(目前处于使用ps的总数),keyActive(当前sql的ps使用数),keyIdle(当前sql的ps空闲数) 针对开启了ps cache
1.2..... 3. 4. 5..... 6.
1.@BTrace 2.public class DbcpTracer { 3. 4. @OnMethod(clazz = "org.apache.commons.pool.impl.GenericObjectPool", method = "/.*Object/", location = @Location(value = Kind.ENTRY)) 5. public static void poolMonitor(@Self Object self) { 6. Field maxActiveField = field("org.apache.commons.pool.impl.GenericObjectPool", "_maxActive"); 7. Field numActiveField = field("org.apache.commons.pool.impl.GenericObjectPool", "_numActive"); 8. Field poolField = field("org.apache.commons.pool.impl.GenericObjectPool", "_pool"); 9. Field sizeField = field("org.apache.commons.pool.impl.CursorableLinkedList", "_size"); 10. int maxActive = (Integer) get(maxActiveField, self); 11. int numActive = (Integer) get(numActiveField, self); 12. int numIdle = (Integer) get(sizeField, get(poolField, self)); 13. 14. println(strcat(strcat(strcat(strcat(strcat("maxActive : ", str(maxActive)), " numActive : "), str(numActive)), 15. " numIdle : "), str(numIdle))); 16. } 17. 18. @OnMethod(clazz = "org.apache.commons.pool.impl.GenericKeyedObjectPool", method = "/.*Object/", location = @Location(value = Kind.ENTRY)) 19. public static void psMonitor(@Self Object self, Object key) { 20. Field maxTotalField = field("org.apache.commons.pool.impl.GenericKeyedObjectPool", "_maxTotal"); // connectio的maxActive 21. Field totalActiveField = field("org.apache.commons.pool.impl.GenericKeyedObjectPool", "_totalActive"); // connectio的active 22. Field poolMapField = field("org.apache.commons.pool.impl.GenericKeyedObjectPool", "_poolMap"); // connectio的active 23. 24. Field keyActiveField = field("org.apache.commons.pool.impl.GenericKeyedObjectPool$ObjectQueue", "activeCount"); // key的active 25. Field keyIdleField = field("org.apache.commons.pool.impl.GenericKeyedObjectPool$ObjectQueue", "queue"); // key的idle 26. Field keyIdleSizeField = field("org.apache.commons.pool.impl.CursorableLinkedList", "_size"); 27. 28. Field sqlField = field("org.apache.commons.dbcp.PoolingConnection$PStmtKey", "_sql"); 29. 30. int maxTotal = (Integer) get(maxTotalField, self); 31. int totalActive = (Integer) get(totalActiveField, self); 32. Map
转载地址:http://yzcvl.baihongyu.com/