다음 코드가 포함 된 수신기 메서드가 있습니다. 그 방법은 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);
}
}
}
누수의 원인을 찾으려면 JVM의 힙 덤프를 주기적으로 분석하여 분석해야합니다. 이렇게하면 힙에 어떤 종류의 개체가 누적되어 있는지 알 수 있으며 누출 원인을 분명히 알 수 있습니다. – cheeken