java - Full GC后socket实例还在继续增长吗?

标签 java garbage-collection bonecp resource-leak

我有套接字应用程序,其代码片段如下。我已确保套接字在finally block 中关闭。我猜我昨天或前天刚刚进行了一次 Full GC。然后我通过jmap比较这次FGC之前和今天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);
        }
       }
      }

最佳答案

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

关于java - Full GC后socket实例还在继续增长吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20312739/

相关文章:

c# - 应该如何管理在函数范围内声明的定时器的清理?

执行了Java垃圾回收,但未收到GC通知

c# - 追踪仅在一个客户的盒子上可见的内存泄漏 (C#) 的最佳方法

mysql - BoneCP 连接超时

java - 单击按钮时,在 JSP 上显示 'Please wait' 警报。当 servlet 上的处理完成时,删除警报

java - 我设置方法的方式有问题吗?

java - 从 MySQL 5.5 升级到 5.6 并获取 "SQLException: Connection is closed"

java - 如何使用 JDBC 来最大化 Netty 的性能?

java - SAXParseException;源代码解析 : Cannot resolve the name '...' to a(n) 'type definition' component

java - 带有 ListView 的自定义适配器中的多个复选框、indexOutOfBounds