2013-11-22 3 views
0

JDBC 에 의해 사용 된 공간을 닫고 finally 블록에서 값을 null로 설정하여 해제하려고합니다. 예는 : 모든 가능한 결과가 0 대신 결과 집합 오픈 YourKit 게재 NULL로 폐쇄 설정 되더라도왜 JDBC ResultSet은 가비지 수집되지 않습니다

try{ 
    //some query executed here and resultset used to get the values from the db 
}catch(Exception exp){ 
//log exception here 
}finally{ 
//close resultset 
    if(rs != null){ 
    rs.close(); 
    rs = null; 
} 
} 

I가 YourKit 오픈 결과 집합 수를 확인 오픈 결과 집합에 대한 몇몇 비 제로 값을 보이고있다. 누구든지 열려있는 결과 집합의 수를 0으로 만들기 위해 여기 나를 도울 수 있습니까?

미리 감사드립니다. close 실패에 대한이와

finally { 
if(rs != null) { 
try{ 
rs.close(); 
}catch(Exception e) { 
//handle, log .. 
} 
} 

이어야 당신은 찾아 볼 수 있습니다 로그 및 수 : Tanmayee이

+0

IIRC, 연결은 열린 채로있는 한 계속해서 생성 된 결과 세트를 유지할 수 있습니다. 다중 스레드 응용 프로그램에서 메모리 누수를 조사하면서이 문제를 보았습니다. 연결을 닫을 때 결과가 수집되는지 확인하십시오. – 0xCAFEBABE

답변

0

close가 열려 ResultSet (드물지만 가능한 시나리오)이 발생할 수있는 오류를 던질 수, 이상적으로 DB 자원 청소 try-catch에서 발생한다 YourKit과 동기화!

+0

제안 해 주셔서 감사합니다. ResultSet을 닫을 때 예외가 발생하지 않도록이 코드에 추가 할 것입니다. – tanmayees

1

Java의 가비지 수집은 메모리를 할당 해제하고 즉시 메모리를 해제합니다. Java에서 가비지 수집기를 실행할 때 JVM까지 가능한 조건 중 일부가 메모리 부족 일 수 있습니다. JVM이 가비지 콜렉터를 호출 할 때의 상태이며, System.gc() 메소드를 호출 할 때 하나이지만이 메소드를 호출해도 가비지 콜렉터가 호출되지 않습니다. 위의 경우 가비지 수집에 적합한 개체를 만들고 있지만 메모리에서 아무 것도 할당 해제하지 않습니다.

+1

Aayush의 진술을 명확하게하기 위해서 ... 당신이'System.gc()'를 호출 할 때, JVM의 * 요청 *을 만들어서 쓰레기를 모으는 것이지 요구가 아니다. JVM은 요청할 때 쓰레기를 수집하거나 수집하지 않을 수 있습니다. 따라서 ResultSet 객체는 가비지 수집의 후보로 메모리에 남아있을 수 있습니다. [doc] (http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#gc())를 참조하십시오. –

+0

빠른 답장을 보내 주신 Aayush와 Basil 씨께 감사드립니다. ResultSet이 YourKit에 표시되는 횟수가 0이 아니더라도 메모리 누수가 발생하지 않을 수 있습니다. – tanmayees

+0

답을 이해했다면 질문을 읽음으로 표시하십시오. –

0

finally 블록에서는 다음과 같이 작성할 수 있습니다. 왜냐하면 try-catch 블록을 사용하는 이유는 때때로 ResultSet 객체를 사용할 수 있거나 사용할 수 없다는 것을 의미하기 때문입니다. ResultSet를 메모리에있을 때

finally{ 
try{ 
if(rs!=null){ 
rs.close(); 

    }}catch(Exception e){ 
e.printStackTrace(); 
} 
} 
+0

제안 해 주셔서 감사합니다. 이것을 코드에 추가하겠습니다. – tanmayees

1

는 YourKit 개발자로서, 나는 (때 그들은 안) 및 캡처 메모리 스냅 샷 상황을 재현하는 것이 좋습니다 것입니다.

그런 다음 ResultSet에서 가비지 수집기 루트까지의 경로를 찾을 수 있습니다. ResultSets이 유출되는 이유가 바로 공감입니다. 다음은 GC 경로로 작업하는 방법을 알려주는 링크입니다. http://www.yourkit.com/docs/java/help/paths.jsp

관련 문제