Java 응용 프로그램을 연중 무휴로 실행 중이며, MySQL 서버와 TimerTask (Akka를 실행 중입니다)에 연결되어 있습니다. 1 주 또는 그 이하의 작업 후에 OutOfMemoryError를 실행 중이고 힙 덤프는 4 백만 개가 넘는 문자열로 LinkedHashMap을 보여 주며 800MB의 힙을 사용하는 java.io.DeleteOnExitHook의 GC 루트를가집니다.DeleteOnExitHook에서 메모리 누수가 발생했습니다.
모든 문자열은 /tmp/jar_cachexxxx.tmp
이 문제 같은 것이 오픈 JDK 런타임 환경 (1.8.0_101-B13를 구축) 실행하는 두 기계에 일치합니다. JDBC 드라이버는 maven "mysql-connector-java"버전 5.1.38에서 제공되는 것으로, 연결 풀 BoneCP, 버전 0.8.0을 사용하고 있습니다.
누구나이 누출에 대해 알고 있나요?
업데이트 - 우리는 프로젝트의 컴파일러를 변경 한 후 문제가 해결 5/12/16
. 우리는 eclipse jar creator가 jar 캐시와 관련이있는 유일한 것이라는 것을 알아 차 렸습니다. 그래서 maven을 사용하여 프로젝트를 컴파일 한 후에 메모리 누수가 사라졌습니다.
당신이 데이터베이스를 액세스하는 방법에 대해 더 많은 정보를 제공 할 수를 Akka를 사용하고 있습니까? Java.io.File.deleteOnExit()를 호출하고 있습니까? 얼마나 많은 문자열을 보았습니까? "/tmp/jar_cachexxxx.tmp"처럼 보입니까? 빨간 새끼일지도 모릅니다. 이러한 문자열이 1000 개라도 800MB를 차지하지 않습니다. 다른 문자열을 찾으십시오. – joseph
"/tmp/jar_cachexxxx.tmp"와 같은 문자열을 어떻게 찾았습니까? 800MB는 약 800MB/30 바이트 = 26,666,666 개의 문자열이 필요하다는 것을 의미합니다. – joseph