2016-05-02 2 views
1

У меня есть функция, которая работает каждый час на сервере websphere.Настраиваемая память увеличивается во время процесса свопинга

Вскоре функция считывает данные из базы данных и свопит данные со старой. До нового вызова этой функции он хранит данные в памяти для быстрого ответа в онлайн-запросах.

Моя проблема заключается в том, что, как обычно, в начале процесса свопинга моя куча увеличивает скорость дублирования данных, поэтому конец процесса свопинга я освободил все временные переменные, и моя куча уменьшается. Таким образом, использование памяти перед процессом подкачки и использование памяти после процесса свопинга одинаковы.

Но собственная память ((собственная память библиотеки Java) всегда увеличивается, она не уменьшается в конце процесса/функции свопинга или когда я освобождаю все временные переменные. Я не могу найти причину этого.

Вот моя функция

private void PopulateTL(String projectName) throws Exception { 

    // Setting old models 
    Hashtable<String, PreparedStatement> scoringFormulaMapCurrent = new Hashtable<String, PreparedStatement>(); 
    Hashtable<String, RSP_TL_Model> calibrationMapCurrent = new Hashtable<String, RSP_TL_Model>(); 
    Hashtable<String, PreparedStatement> scoringFormulaMapOld = scoringFormulaMapTL; 
    Hashtable<String, RSP_TL_Model> calibrationMapOld = calibrationMapTL; 

    // Getting new models 
    String orgDbSource = masterConfigXML.getElement("Logging", 
      "dbSource"); 
    String orgSql = masterConfigXML.getElement("orgSQL", "select" 
      + projectName); 
    Context ctx = new InitialContext(); 
    DataSource dataSource = (DataSource) ctx.lookup(orgDbSource); 
    Connection connorg = dataSource.getConnection(); 
    PreparedStatement prepStmtorg = connorg 
      .prepareStatement(orgSql); 
    ResultSet rsorg = prepStmtorg.executeQuery(); 

    ArrayList<String> keys = new ArrayList<String>(); 

    while (rsorg.next()) { 

     String ScoringSql = ""; 
     double Beta1 = 1.0; 
     double Beta2 = 0.0; 

     StringBuffer str = new StringBuffer(); 
     String strng; 
     BufferedReader bufferRead = new BufferedReader(
       ((Clob) rsorg.getClob("SQL_FORMULA")) 
         .getCharacterStream()); 
     while ((strng = bufferRead.readLine()) != null) 
      str.append(strng); 
     ScoringSql = str.toString(); 
     if ((Double) rsorg.getDouble("SLOPE") == null) 
      Beta1 = Integer.MAX_VALUE; 
     else 
      Beta1 = rsorg.getDouble("SLOPE"); 
     if ((Double) rsorg.getDouble("INTERCEPT") == null) 
      Beta2 = Integer.MAX_VALUE; 
     else 
      Beta2 = rsorg.getDouble("INTERCEPT"); 
     if (rsorg.getInt("SAMPLE_COUNT") < 5) { 
      Beta1 = 1; 
      Beta2 = 0; 
     } 
     String key = String.format("%s-%s-%s-%s", 
       rsorg.getObject("FLAG_VADE_NEW").toString(), rsorg 
         .getString("SPLIT"), rsorg.getObject("BALANCE") 
         .toString(), rsorg.getString("CHANNEL")); 
     keys.add(key); 
     if (projectName.equals("RSP_TL")) { 

      PreparedStatement psFormula = inMemoryConn 
        .prepareStatement(regulateScoringFormula(ScoringSql, 
          projectName)); 

      scoringFormulaMapCurrent.put(key, psFormula); 

      calibrationMapCurrent.put(key, new RSP_TL_Model(Beta1, Beta2)); 

     } 
    } 


    if (scoringFormulaMapCurrent.size() == 0) { 
     throw new Exception(
       "RSPSERVER: " 
         + projectName 
         + "refresh failed. Returned zero records from formula table."); 
    } else { 
     // set global models from current models 
     scoringFormulaMapTL = scoringFormulaMapCurrent; 
     calibrationMapTL = calibrationMapCurrent; 
     System.out.println("RSPSERVER: " + projectName 
       + " Refresh completed..." + "Size of Hashtable: " 
       + scoringFormulaMapTL.size()); 
     //close old models' preparedStatements 
     for (int i = 0; i < keys.size(); i++) { 
      if (scoringFormulaMapOld.get(keys.get(i)) != null) { 
       ((PreparedStatement) scoringFormulaMapOld.get(keys.get(i))) 
         .close(); 
       calibrationMapOld.remove(keys.get(i)); 
      } 
     } 
     // clear old models' hash table 
     scoringFormulaMapOld.clear(); 
     // deallocate current models 
     scoringFormulaMapCurrent = null; 
     calibrationMapCurrent = null; 

     prepStmtOrganon.close(); 
     rsorg.close(); 
     connorg.close(); 
    } 
} 

родной памяти увеличивается каждый час: native memory increasing every hour

  • версия JDBC: 10.2.0.1.0
  • оракул версия: Oracle 11g 11,1
  • WEBSPHERE версия: 7.0.0.37
  • сервер: unix redhat 5.11
+1

Как вы узнали, что ваша «родная» память растет? Покажите некоторые доказательства. –

+0

Я использую для этого инструмент мониторинга. Я добавил изображение в качестве доказательства. @JimGarrison – neverwinter

ответ

1

Основная проблема заключается в том, что вы создаете PreparedStatement (s) e g prepStmtorg, который вы не закрываете, и это может привести к утечке памяти. Я также предлагаю

  • Вы используете анализатор дампа кучи (например, visualVM), чтобы увидеть, где хранится память. Я предпочитаю YourKit, поскольку мне это проще, чем VisualVM.
  • не использовать Hashtable, как он был заменен на Java 1.2 с помощью HashMap
  • не использовать StringBuffer, как он был заменен StringBuilder в Java 5.0 (еще десять лет назад)
  • рассмотреть вопрос об использовании RedHat 7.x, как 5.x довольно старый. RedHat 5.x будет конец жизни в следующем году, через десять лет после его выхода.

Я предполагаю, что это было написано кем-то еще несколько раз назад, возможно, девять лет назад. Возможно, стоит исправить код.

родной памяти растет каждый час,

Я хотел бы начать с обеспечения не имеют утечку ресурсов на куче, которая ведет к ресурсу просачиваться кучи.

+0

В своп-время я меняю старые подготовленные заявления на новые. И я храню их в хэш-таблице. В то время как swap, я закрываю и удаляю и устанавливаю null в старые и выделяю новые. кстати, я изменил hashtable на hashmap и stringbuffer на stringbuilder, но ничего не изменилось. По-прежнему растет внутренняя память. Мы уже рассматриваем возможность обновления версии redhat, но это сложно из-за некоторых других причин.Кстати, я не против его причины по redhat версии @Peter Lavrey – neverwinter

+0

@neverwinter где вы закрываете 'prepStmtorg'? Вам нужно закрыть все, а не только большинство из них. –

+0

Lavrey на этой линии, я закрываю. ((PreparedStatement) scoringFormulaMapOld.get (keys.get (i))) .close(); – neverwinter

Смежные вопросы