program tip

메모리 누수입니까?

radiobox 2020. 12. 9. 08:01
반응형

메모리 누수입니까? java.lang.ref.Finalizer가 메모리를 많이 사용하는 이유


내 프로그램에서 힙 덤프를 실행했습니다. 메모리 분석기 도구에서 열었을 때 java.lang.ref.Finalizerfor org.logicalcobwebs.proxool.ProxyStatement가 많은 메모리를 차지 한다는 것을 알았 습니다. 왜 그렇습니까?

스크린 샷


일부 클래스는 Object.finalize()메서드를 구현합니다 . 이 메서드를 재정의하는 개체는 백그라운드 스레드 호출 종료 자에 의해 호출되어야하며, 이것이 발생할 때까지 정리할 수 없습니다. 이러한 작업이 짧고 많은 것을 버리지 않으면 모두 잘 작동합니다. 그러나 이러한 개체 및 / 또는 해당 종료자를 많이 생성하는 경우 시간이 오래 걸리면 마무리 할 개체 대기열이 쌓입니다. 이 대기열이 모든 메모리를 사용할 수 있습니다.

해결책은

  • 가능한 경우 finalize () d 객체를 사용하지 마십시오 (객체에 대한 클래스를 작성하는 경우)
  • 마무리를 매우 짧게 만드십시오 (사용해야하는 경우).
  • 매번 그러한 객체를 버리지 마십시오 (재사용 시도).

마지막 옵션은 기존 라이브러리를 사용할 때 가장 적합 할 것입니다.


내가 알 수 있듯이 Proxool은 JDBC 연결을위한 연결 풀입니다. 이것은 문제가 응용 프로그램이 연결 풀을 잘못 사용하고 있다는 것을 나에게 제안합니다. close명령문 개체 를 호출 하는 대신 코드에서 해당 개체 및 / 또는 부모 연결을 삭제할 수 있습니다. Proxool은 파이널 라이저에 의존하여 기본 드라이버 구현 객체를 닫습니다.하지만이를 위해서는 파이널 라이저 인스턴스가 필요합니다. 또한 연결이 필요한 것보다 더 자주 (실제) 데이터베이스 연결을 열거 나 닫게하여 성능에 좋지 않음을 의미 할 수 있습니다.

따라서 유출 된 ResultSet, Statement 및 / 또는 Connection 객체에 대한 코드를 확인하고 finally블록으로 닫는 것이 좋습니다 .


메모리 덤프를 살펴보면 898,527,228 바이트가 어디로 가는지 걱정할 것입니다. 대부분은 ID가 인 Finalizer 개체에 의해 유지됩니다 2aab07855e38. 여전히 덤프 파일이있는 경우 해당 파일이 무엇 Finalizer 의미 하는지 살펴보십시오 . Proxool 개체보다 문제가 더 많아 보입니다.

참고 URL : https://stackoverflow.com/questions/8355064/is-memory-leak-why-java-lang-ref-finalizer-eat-so-much-memory

반응형