java - 堆大小持续增长,但 jstat S0 和 S1 持续清理

标签 java

我们正在 centos 上对一个应用程序进行内存测试。我们注意到,顶部显示内存不断增长,我们怀疑这是由于 JVM 需要额外的空间。此外,在应用程序代码的末尾我们有这几行。我们注意到这还表明,使用的内存和堆大小也不断增长,最初是几十兆字节,现在是几百兆字节。

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);
        }


     }

最佳答案

听起来您的应用程序存在内存泄漏。当执行一个不需要更多内存的进程时,Java 的内存使用量以恒定速率增加是不正常的。

关于java - 堆大小持续增长,但 jstat S0 和 S1 持续清理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12024605/

相关文章:

java - 将 Quartz 表达式预测到下一个工作日

java - EntityManager createQuery 上的 QuerySyntaxException hibernate 无效路径

java - 重复音频文件,并在任务改变时停止

java - 使用 GWT 在 DisclosurePanel 内调整大小布局面板

java - react-native运行android无法正常工作。无法初始化类org.codehaus.groovy.runtime.InvokerHelper

java - 调用 Map#put() 时关于原始类型的编译器警告

java - 命中 javax.net.ssl.SSLPeerUnverifiedException : peer not authenticated even imported cert

java - InputStream、mark()、reset()

java - 抛出异常后的 FacesContext 消息

java - 在 if 语句中添加数组异常