0

我有如下代码片段的套接字应用程序。我已确保套接字在 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);
        }
       }
      }
4

1 回答 1

1

我看到您正在使用 BoneCP - 我也是。我在 BoneCP 中发现了一个错误,它使我的应用程序打开了太多的连接。我不确定我到底是如何修复它的,我基本上把我能想到的所有东西都扔到了这个问题上,我不确定是哪些更改修复了它,但升级到最新的 BoneCP 快照可能会有所帮助。

于 2013-12-01T17:50:11.003 回答