2016-09-30 4 views
2

후, 그들의 대부분은 등 JDBC 연결과 같은 라이브러리의 인스턴스입니다.java.lang.ref.Finalizer에서 OutOfMemory 나는 그것이 마무리를 기다리고있는 객체을 많이 가지고 실현 힙 덤프를 추출 메모리 올리고

왜 단순히 완성되지 않을 것이다, 큐에 해당 인스턴스가 finalize() 구현 클래스는 기본적 것을 알고?

며칠 전 나는 그런 인스턴스의 메모리를 올렸다. 처음에는 새로운 세대가 256MB (-Xmx1g -XX:NewSize=256m -XX:MaxNewSize=256m)로 설정된 1GB가있었습니다. 무거운 캐싱 기능을 추가함에 따라 해당 인스턴스에 할당 된 메모리를 3GB (-Xmx3G -XX:NewSize=512m -XX:MaxNewSize=512m)로 늘 렸습니다. 그 순간부터 우리는 추억의 일부를보기 시작합니다. 조금만 조사해 보면 Finalization을 기다리는 많은 java.lang.ref.Finalizer와 객체를 발견했습니다.

어떻게 서로 관련 될 수 있습니까? 심지어 관련 될 수 있을까요?

답변

3

왜 그들은 단순히 완성되지 않을 것이다?

일부 구성 요소는 IO를 포함하는 모든 항목을 완료하는 데 시간이 오래 걸립니다. JDBC 연결은 상대적으로 무거운 네트워크 자원이므로 더 오래 걸릴 수 있습니다.

난 당신이 모든 시간을 파괴/연결 풀 (대부분의 JDBC 라이브러리들이 내장되어있다)이 생성되지 않은이 방법을 사용하는 것이 좋습니다.

참고 : 1Gb = 1 기가 비트 또는 128MB (메가 바이트) 256 mb을 명확히하기 위해 256 밀리 비트 또는 약 1/4 비트입니다. -XX:NewSize=512m은 256MB가 아닌 512MB입니다. 및 -XX:MaxNewSize=512 가장 가능성이 당신이

3Gb-XX:MaxNewSize=512m 3 기가 비트하지만 당신이 1 GB 이상 8 기가입니다 -Xmx1G 아닌 3GB의 의미 가정 사용, 그냥 512 바이트로 작동하지 않을 것입니다.

+0

당신이 맞습니다. 내 질문에 단위를 업데이트했습니다. –

+0

제가 궁금한 점은 이것이 어떻게 관련이 있는지입니다. 왜 'finalize()'문제가 메모리 변경 후에 만 ​​발생했는지, 이것이 나는 새로운 세대와 늙은 세대 사이에 사용 된 배급량과 관련이 있습니까? –

+0

@FranciscoSpaeth 메모리가 부족할 때 최종 리소스를 생성하는 응용 프로그램의 속도가 느려집니다. 멀티 스레드 일 수 있습니다. 더 많은 메모리를 확보하면 정리할 리소스를 더 많이 생성 할 수 있지만 단일 스레드 파이널 라이저는 유지할 수 없으므로 병목 현상이 발생합니다. 간단히 말해, 1 비트 속도를 높이면 성능 문제가 다른 곳으로 옮겨져 프로세스에서 문제가 발생할 가능성이 있습니다. –

1

Object.finalize()는 정화 단계의 마지막에, 가비지 컬렉터에 의해 호출된다. GC는 주기적으로 실행됩니다 (사용하는 GC에 따라 7 ~ 8 개가 CMS 인 경우, 또는 구성된 경우 G1). '대기 완료'에 많은 객체가있는 것은 GC가 실행될 필요가없는 많은 양의 힙과 충분한 메모리 (G1이 마이크로 클린업을 훨씬 자주 실행하므로 CMS가 가장 가능성이 높음)을 의미 할 수 있습니다.

당신의 JVM 시작 매개 변수로 추적 GC를 추가하고 실행하는 빈도 모니터링 : -XX : + PrintGCDetails -XX : + PrintGCTimeStamps 참조 : http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html

당신이 힙 작은 물체를 많이 사용하는 경우>의 1Gb을 G1 가비지 수집기를 사용하는 것이 이러한 작업에 더 적합하고 CMS의 '세계를 멈추게'하는 행동을하지 않기 때문에 고려해야 할 수도 있습니다.

관련 문제