메모리 누수입니까? java.lang.ref.Finalizer가 메모리를 많이 사용하는 이유
내 프로그램에서 힙 덤프를 실행했습니다. 메모리 분석기 도구에서 열었을 때 java.lang.ref.Finalizer
for org.logicalcobwebs.proxool.ProxyStatement
가 많은 메모리를 차지 한다는 것을 알았 습니다. 왜 그렇습니까?
일부 클래스는 Object.finalize()
메서드를 구현합니다 . 이 메서드를 재정의하는 개체는 백그라운드 스레드 호출 종료 자에 의해 호출되어야하며, 이것이 발생할 때까지 정리할 수 없습니다. 이러한 작업이 짧고 많은 것을 버리지 않으면 모두 잘 작동합니다. 그러나 이러한 개체 및 / 또는 해당 종료자를 많이 생성하는 경우 시간이 오래 걸리면 마무리 할 개체 대기열이 쌓입니다. 이 대기열이 모든 메모리를 사용할 수 있습니다.
해결책은
- 가능한 경우 finalize () d 객체를 사용하지 마십시오 (객체에 대한 클래스를 작성하는 경우)
- 마무리를 매우 짧게 만드십시오 (사용해야하는 경우).
- 매번 그러한 객체를 버리지 마십시오 (재사용 시도).
마지막 옵션은 기존 라이브러리를 사용할 때 가장 적합 할 것입니다.
내가 알 수 있듯이 Proxool은 JDBC 연결을위한 연결 풀입니다. 이것은 문제가 응용 프로그램이 연결 풀을 잘못 사용하고 있다는 것을 나에게 제안합니다. close
명령문 개체 를 호출 하는 대신 코드에서 해당 개체 및 / 또는 부모 연결을 삭제할 수 있습니다. Proxool은 파이널 라이저에 의존하여 기본 드라이버 구현 객체를 닫습니다.하지만이를 위해서는 파이널 라이저 인스턴스가 필요합니다. 또한 연결이 필요한 것보다 더 자주 (실제) 데이터베이스 연결을 열거 나 닫게하여 성능에 좋지 않음을 의미 할 수 있습니다.
따라서 유출 된 ResultSet, Statement 및 / 또는 Connection 객체에 대한 코드를 확인하고 finally
블록으로 닫는 것이 좋습니다 .
메모리 덤프를 살펴보면 898,527,228 바이트가 어디로 가는지 걱정할 것입니다. 대부분은 ID가 인 Finalizer 개체에 의해 유지됩니다 2aab07855e38
. 여전히 덤프 파일이있는 경우 해당 파일이 무엇 을 Finalizer
의미 하는지 살펴보십시오 . Proxool 개체보다 문제가 더 많아 보입니다.
'program tip' 카테고리의 다른 글
URL 매개 변수와 쿼리 문자열의 차이점은 무엇입니까? (0) | 2020.12.09 |
---|---|
for 루프에서 임의의 대상 표현식이 허용되는 이유는 무엇입니까? (0) | 2020.12.09 |
rbenv, rvm 및 chruby의 차이점은 무엇입니까? (0) | 2020.12.09 |
콘텐츠 또는 최대 너비와 함께 200px (둘 중 더 큰 값)별로 최소 너비를 설정합니다. (0) | 2020.12.09 |
관리되지 않는 C ++ 클라이언트 용 WCF 서비스 만들기 (0) | 2020.12.09 |