我有套接字应用程序,代码片段如下所示。我确保套接字在finally块中关闭。我只是在昨天或前一天有一个完整的GC。然后我在此FGC之前通过jmap比较套接字的实例,今天是在FGC之后,但实例没有减少但是继续增加?可能是什么原因或引用jmap是错误的?另一件事是,在完整的GC之后,老一代不会变成0?
BoneCP connectionPool = null;
class ConnectionHandler implements Runnable {
Connection dbconn = null;
public void run() { // etc
BufferedWriter writeBuffer = null;
BufferedReader readBuffer = null;
String capturedMessage="";
try{
dbconn = connectionPool.getConnection();
dbconn.setAutoCommit(false);
while ((nextChar=readBuffer.read()) != -1){
capturedMessage += (char) nextChar;
if (nextChar == '*'){
try{
///For select we do this
Statement stmt2 = null;
stmt2 = dbconn.createStatement();
String selectQuery2= .........
ResultSet rs2 = stmt2.executeQuery(selectQuery2);
if(rs2.next()){
}
try{
if ( rs2!= null ){
rs2.close();
} else{
System.out.println("No rs2 exist");
}
if ( stmt2!= null ){
stmt2.close();
} else{
System.out.println("No stm2 exist");
}
}catch(SQLException ex)
{
System.out.println("SQLException has been caught for stmt2");
ex.printStackTrace(System.out);
}
funct1();
funct2();
dbconn.commit
}
catch (SQLException ex){
ex.printStackTrace(System.out);
try{
dbconn.rollback();
}
catch (Exception rollback){
rollback.printStackTrace(System.out);
}
}
catch (Exception e){
e.printStackTrace(System.out);
try{
dbconn.rollback();
}
catch (Exception rollback){
rollback.printStackTrace(System.out);
}
}
finally{
}
}
catch (SocketTimeoutException ex){
ex.printStackTrace();
}
catch (IOException ex){
ex.printStackTrace();
}
catch (Exception ex){
ex.printStackTrace(System.out);
}
finally{
try{
if ( dbconn != null ){
dbconn.close();
}
else{
System.out.println("dbConn is null in finally close");
}
}
catch(SQLException ex){
ex.printStackTrace();
}
try{
if ( writeBuffer != null ){
writeBuffer.close();
}
else{
System.out.println("writeBuffer is null in finally close");
}
}
catch(IOException ex){
ex.printStackTrace(System.out);
}
}
}
答案 0 :(得分:1)
我看到你正在使用BoneCP - 我也是。我在BoneCP中发现了一个错误,这让我的应用程序打开了太多的连接。我不确定我是如何修复它的,我基本上把所有我想到的东西都扔到了问题上,而且我不确定哪个修改了它,但升级到最新的BoneCP快照可能会有所帮助。