1

다음 코드가 포함 된 수신기 메서드가 있습니다. 그 방법은 1 초에 여러 번 호출됩니다. 그러나 응용 프로그램 내에서 메모리 누수가 발생합니다.PreparedStatement가 OOM 오류를 일으킴

나는 그것이 준비된 진술 (각 객체가 수신 될 때마다 새로 생성)을 처리하는 방식과 같을 것이라고 생각한다. 나는 분명히 잘못된 것을하고 있습니까? 한번 PS를 사용하면 PS를 null로 설정해야합니까? 추신은 어떤 이유로 유지되고 있습니까?

또한 수동으로 PS의 테이블 이름을 지정하고 있습니다. 그 재편성은 준비된 선언문을 완전히 사용하는 목적을 무너 뜨릴 수 있습니까? 당신이 finally 블록 A의 항상 사용 후

String text = object.getText(); 

//determineDb method determines the db for the object based on its content 
ArrayList<Topic> toAddList = determineDatabase(text); 
if (toAddList.size() > 0) { 
    int epoch = (int) (System.currentTimeMillis()/1000); 
    //Topic class contains DB info, topic name and associated terms 
    for (Topic a : toAddList) { 
     try { 
      pst = con 
    .prepareStatement("INSERT INTO " 
      + a.getTopic() 
      + " (created, received, username, text, ignored, retweet, value) VALUES(?, ?, ?, ?, ?, ?, ?)"); 
      pst.setString(1, String.valueOf(object.getCreatedAt().getTime()/1000)); 
      pst.setString(2, String.valueOf(epoch)); 
      pst.setString(3, object.getUser()); 
      pst.setString(4, text); 
      pst.setInt(5, 0); 
      pst.setInt(6, object.isOriginal() ? 1 : 0); 
      pst.setDouble(7, otherClass.analyzeString(object.getText())); 
      pst.executeUpdate(); 
     } catch (SQLException ex) { 
      System.out.println(ex); 
     } 
    } 
} 
+0

누수의 원인을 찾으려면 JVM의 힙 덤프를 주기적으로 분석하여 분석해야합니다. 이렇게하면 힙에 어떤 종류의 개체가 누적되어 있는지 알 수 있으며 누출 원인을 분명히 알 수 있습니다. – cheeken

답변

3

당신 당신의 PreparedStatement를 닫아야합니다. Java에서 외부 리소스에 해당하는 객체는 항상으로 취급해야합니다 (더 이상 유용하지 않게되자 마자). 모든 JDBC 자원은이 범주 (ResultSet, Statement, Connection)에 속합니다.

+0

고맙습니다. 하루를 기다릴 필요없이 이것을 테스트 할 수있는 방법이 없으므로 보통 오류가 발생하기까지 걸립니다. 힙 공간을 줄이면 유익할까요? –

+0

@Peter - jvisualvm (jdk와 함께 제공됨) 또는 기타 여유 메모리 프로파일 러와 같은 도구를 사용하여 jvm 메모리를 모니터하고 안정적인지 증가 중인지 확인할 수 있습니다. 힙 메모리를 낮추면 도움이됩니다. – jtahlborn

+0

@Peter - 아래에서 언급 한 "mem out of mem"플래그를 사용하면 응용 프로그램이 손상된 후 힙을 검사 할 수 있으므로 (모니터링하지 않을 때 발생할 수 있음) 권장합니다. – jtahlborn

관련 문제