介绍
对于程序开发一般要从两个角度去考虑,业务开发更关注功能逻辑实现,是一个业务问题;技术开发则需要关注性能稳定性,是一个纯技术问题。功能逻辑是一个大话题,涉及思维方式,业务需求,比较复杂,不太好量化,但是对于性能稳定性,却是一个技术领域的问题,对性能的追求是一个码农应有的素质。
要想对性能有所追求,就要对系统有所了解,项目开发不是一个独立的事件,大的工程往往依赖很多人很多工具的辅助才能完成。正常情况下只需要定义好接口,把功能当一个黑盒来使用就行了,但是涉及到性能,有时候,就有必要适当考虑一下“黑盒”内部实现结节了。
说了半天闲话,其实对于程序开发者尤其是java开发者,我们开发中经常用到各种成熟的框架,用起来很舒服,用得舒服的时候往往会想为啥用得这么舒服,这时候就会去看文档了,但是要想学习精髓,还是得写demo, 看源码,debug,本文即介绍一个辅助看源码和debug的工具
工具
地址
项目地址:https://github.com/fengzhongke/java-tracer
工具地址:https://github.com/fengzhongke/java-tracer/raw/master/java-tracer.jar
功能
java-tracer工具通过agent的方式,启动的时候挂载到java进程上,就可以记录某些方法运行的栈记录了,这些运行栈记录以xml的形式展现,以便收缩和展开
使用
1.写一个交互式数据库查询程序,类名com.hema.sre.pool.test.JdbcTest,当从console输入一条sql加回车之后,执行函数execSql并返回结果
//com.hema.sre.pool.test.JdbcTest
public class JdbcTest {
public static void main(String[] args) throws Exception {
try (Scanner scanner = new Scanner(System.in)) {
while (scanner.hasNext()) {
String line = scanner.nextLine();
if (!"q".equalsIgnoreCase(line)) {
execSql(line);
}
}
}
}
public static void execSql(String sql) throws SQLException{
String url = "jdbc:mysql://127.0.0.1:3306";
String user = "kongche";
String password = "hanlang.hl";
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
conn = getConn(url, user, password);
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
ResultSetMetaData meta = rs.getMetaData();
int size = meta.getColumnCount();
while (rs.next()) {
for (int i = 1; i <= size; i++)System.out.println(meta.getColumnName(i) + ":" + rs.getString(i));
}
} finally {
if (rs != null)rs.close();
if (stmt != null)stmt.close();
if (conn != null)conn.close();
}
}
public static Connection getConn(String url, String user, String password) throws SQLException {
return DriverManager.getConnection(url, user, password);
}
}
2.用下载java-tracer.jar,放在本地,例如放在/tmp/java-tracer.jar
3.启动程序
如果为IDE启动,则在VM参数里面添加 -javaagent:/tmp/java-tracer.jar
如果是直接脚本启动,可以在启动参数里面添加-javaagent:/tmp/java-tracer.jar
效果
基本信息
1.查看信息
用浏览器打开: