在做websocket开发的时候,后台使用java开发,在前端连接的接口中,有读取数据库进行验证的动作。其中连接数据库部分使用了dbcp做缓冲池,在获取连接的时候,使用了一个嵌套(这个嵌套简直害死人,还我调试了两天),嵌套了两个try finally,在每个try中都获取连接getConnection,在每个finally中都释放连接release把连接归还给缓冲池。代码如下:
Connection conn = null;
Statement statement = null;
ResultSet rs = null;
try {
conn = JdbcPool.getConnection();
statement = conn.createStatement();
try {
conn = JdbcPool.getConnection();
statement = conn.createStatement();
} finally {
JdbcPool.release(conn, statement, rs);
}
} finally {
JdbcPool.release(conn, statement, rs);
}
真是自作聪明害死人,后来改成分开的两个try finally问题解决了。
在其中调试用的工具记录下(jdk自带工具):
jmap -histo,用来查看各个类创建的对象个数。
jmap jmap -dump:format=b生成javadump文件,再结合mat进行分析,可以明确的看到哪个类的对象占了大量内存。
jstack 用来查看各个线程的状态,在我的工程中就看到了好几个进程处于等待状态,而且可以看到各个线程的栈调用,很方便。