0

centos でアプリケーションのメモリ テストを行っています。私たちが気付いたのは、JVM が余分なスペースを必要とするためにメモリが増え続けていることを top が示していることです。さらに、アプリケーション コードの最後にこの数行があります。これは、使用メモリとヒープ サイズも増加し続けていることを示しており、最初は数十メガバイトでしたが、現在は数百メガバイトの値になっています。

Runtime runtime = Runtime.getRuntime();
long memory = runtime.totalMemory() - runtime.freeMemory();
System.out.println("\n\nUsed memory is bytes: " + memory);
//Print the jvm heap size.
long heapSize = runtime.totalMemory();
System.out.println("\n\nHeap Size = " + heapSize);

一方、このコマンド /usr/java/jdk1.7.0_03/bin/jstat -gcutil 22805 を使用すると、しばらくすると S0 と S1 の両方がゼロにクリーンアップされていることがわかります。この解釈は、メモリの問題を示していますか、それとも Java の通常の動作ですか?

以下は、コードのスケルトンです。ステートメント6から、whileの大きなループがあり、その中でさらに多くのクエリを取得しましたが、これが原因でしょうか?

try{

         try{ //inner try for each complete message read from the socket connection

//lots of inner queries run based on some logics of if else etc


//sample query of opening and closing both statement and resultsets.

Statement stmt1 = null;
stmt1 = dbconn.createStatement();
String selectQuery1  = "Select query";
ResultSet rs1 = stmt1 .executeQuery(selectQuery1);
while(rs1.next()) {
//process here

}
try{
  if (rs1 != null ){
        rs1.close();
  }
  if (stmt1!= null ){
        stmt1.close()
  }
}
catch(SQLException ex){
  ex.printStackTrace(System.out);
}

          Statement stmt6 = null;
          stmt6 = dbconn.createStatement(); 

String selectQuery3 = "Select query....";
ResultSet rs3 = stmt6.executeQuery(selectQuery3);

          while(rs3.next()) {
              var1= rs3.getInt("value1");
    var2 = rs3.getString("value2");
    if(var2.equals("POINT"){
                  Statement stmt7 = null;
                  stmt7 = dbconn.createStatement();
        String selectQuery4= "select query ... ";
        ResultSet rs4 = stmt7.executeQuery(selectQuery4);
        if(rs4.next()){
    Statement stmt8 = null;
                        stmt8 = dbconn.createStatement();
                        if(lastID>0){

                             String updateQuery2 = "update query .......";
                             count = stmt8.executeUpdate(updateQuery2);
                             String insertQuery2 = "insert query .....";
                             count = stmt8.executeUpdate(insertQuery2);
                             String selectLast1 = "SELECT last_insert_id()";
         ResultSet rs5 = stmt8.executeQuery(selectLast1);
         if(rs5.next()){
                 gFAlertIDOut=rs5.getInt(1);
         gFOutID = lGFID;
         } 
                             String insertQuery3 = "insert query .....";
                             count = stmt8.executeUpdate(insertQuery3);
                             String selectLast2 = "SELECT last_insert_id()";
         rs5 = stmt8.executeQuery(selectLast2);
         if(rs5.next()){
                 gFAlertIDIn=rs5.getInt(1);
         gFIntID = lGFID;
         } 
                             try{
                       if (rs5 != null ){
                           rs5.close();
                      }
                      if (stmt8!= null ){
                         stmt8.close();
                      }
                  }
                  catch(SQLException ex){
                   ex.printStackTrace(System.out);
                  }   

                        }
                        else{

                       }                                 
                  }
                  try{
            if (rs4 != null ){
                rs4.close();
        }
        if (stmt7!= null ){
               stmt7.close();
        }
       }
       catch(SQLException ex){
          ex.printStackTrace(System.out);
       }   

              }
              else{
                  Statement stmt7 = null;
                  stmt7 = dbconn.createStatement();
        String selectQuery4= "select query ... ";
        ResultSet rs4 = stmt7.executeQuery(selectQuery4);
        if(rs4.next()){



                  }

                  try{
            if (rs4 != null ){
                rs4.close();
        }
        if (stmt7!= null ){
               stmt7.close();
        }
       }
       catch(SQLException ex){
          ex.printStackTrace(System.out);
       }   

              }


          }
          try{
    if (rs3 != null ){
       rs3.close();
    }
    if (stmt6!= null ){
       stmt6.close();
    }
}
catch(SQLException ex){
      ex.printStackTrace(System.out);
 }   

dbconn.commit();
}
catch (SQLException ex) { 
  try {    
    dbconn.rollback();  
  } 
  catch (Exception rollback){    
    rollback.printStackTrace(System.out);
  } 
}
catch (Exception e){
 try{    
        dbconn.rollback();  
  } 
  catch (Exception rollback) {    
    rollback.printStackTrace(System.out);
  }
}
     }
     catch (SocketTimeoutException ex){ 
           ex.printStackTrace();
     }  
     catch (IOException ex) { 
           ex.printStackTrace();
     }  
     catch (Exception ex){  
                    ex.printStackTrace(System.out);
     }      
     finally{
        try {
    if ( dbconn != null ){ 
       dbconn.close();
                        }
        }
        catch(SQLException ex){
                    ex.printStackTrace();
        }
        try{ 
              if ( writer1 != null ){
        writer1.close();
    }

        }
        catch(IOException ex){
           ex.printStackTrace(System.out);
        }


     }
4

1 に答える 1

1

アプリケーションでメモリ リークが発生しているようです。Java のメモリ使用量が一定の割合で増加するのは、時間の経過とともにより多くのメモリを必要としないプロセスを実行する場合に正常ではありません。

于 2012-08-19T06:16:17.680 に答える