2016-11-12 14 views
1

보고서를 계산하는 것이 목적 인 응용 프로그램에서 가능한 작업을하고 있습니다.어떤 Finalizer가 시간이 많이 걸리는지 찾는 방법

내 응용 프로그램은 많은 양의 메모리를 사용합니다. 100 개 이상 이동하십시오.

지난 릴리스 이후 큰 성능 저하가있었습니다. 내 조사에 따르면 계산 중에 40 ~ 60 초 사이에 많은 가비지 수집이 발생합니다 !!! 은 JVM 가비지 수집을 때 물론, 응용 프로그램이 절대적으로

내가 지금 조사하고을 동결하고, 및 (JMC은 SerialOld하지만 나는 그것이 정확히 무엇을 의미하는지 모르는 나에게 말한다) 이 가비지 콜렉션의 기원 ... 그리고 이것은 매우 힘든 일입니다. (나는 모든 라이브러리 중에서 우리가 다른 팀에서, 그들 중 일부는 파이널 라이저를 사용하여 통합, 알고)

나는 이러한 가비지 수집이 너무 긴 경우가 finalize 기능 에 많은 시간을 소비하기 때문에, 그것이, 의심

그러나 나는이 가설을 어떻게 모으는 지 (또는 알지 못한다) 모른다. 어떤 파이널 라이저가 시간 소모적인지 찾는 방법. 내가 좋은 도구 또는 좋은 방법 여기

을 찾고

데이터 내가있을 때, 나는 항상 많은 "보류 종료 자"는이 당신이 볼 수 있듯이 JVisualVM Taken from JVisualVM's "Tracer" tab

를 통해 수집 a log 오래된 쓰레기

JVisualVM을 사용할 때 위의 그래프 이 오른쪽에서 왼쪽으로 규칙적으로 스크롤된다는 것은 놀라운 일입니다. 오래된 쓰레기가 으로 트리거되면 스크롤이 멈 춥니 다 (여기서까지 정상적으로 보입니다.이 메시지는 end-of-world입니다). 다시 시작 갑자기 스크롤 할 때 그러나, 그것은하지 이것은 저를 파이 나라가 JVM

차단되었다고 생각 할 수 있습니다

오래된 쓰레기의 끝에서하지만 보류 시리얼의 끝에서 않는 사람이 explaination를 들어 가지고 있습니까 이?

당신에게 대단히 감사합니다 필립

+2

'finalize' 메소드는 가비지 콜렉션 중에 실행되지 않습니다. – apangin

+0

확실한가요? 심지어 "SerializeOld"가비지 수집? 답변 해 주셔서 감사합니다. –

+2

물론입니다. 비 동시 GC 단계에서 Java 코드가 실행되지 않습니다. GC 만 * 최종화 가능한 객체를 발견하여 대기열에 추가합니다. 이 대기열은 나중에 ['Finalizer']에 의해 처리됩니다 (http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/8b04ee324a1a/src/share/classes/java/lang/ref/Finalizer.java# l186) 다른 Java 스레드와 함께 실행되는 Java 스레드. – apangin

답변

1
여기

나는 당신의 종료 자 이론을 조사 할 것 인 것이다.

  1. 자주 사용하는 자바 프로파일 러를 사용하여 JVM을 시작하십시오.

  2. 전체 힙을 얻을 수있을만큼 오래 실행하십시오.

  3. 프로파일 러를 시작하십시오.

  4. 트리거 가비지 수집.

  5. 프로파일 러 중지.

이제 (있는 경우) finalize 방법은 많은 시간을 사용하고 있는지 파악하기 위해 프로파일 정보를 사용할 수 있습니다.


그러나, 나는 진짜 문제는 메모리 누수가 될 것이라고 생각하고 JVM 힙이 재 요구 불가능 개체를 채우고되는 지점에 도착됩니다. 그것은 자주 "SerialOld"가비지 수집을 설명 할 수 있습니다.

또는 큰 힙 문제 일 수 있습니다. 100Gb는 ... 크다.

2

내 응용 프로그램은 많은 양의 메모리를 사용합니다. 100 개 이상 이동하십시오.

JMC는 그들이 SerialOld하지만 난 당신이 다음 긴 일시 중지 직렬 컬렉터이기 때문에 예상 할 수있는 100GB의 힙의 일련 수집기를 사용하는 경우 정확히

을 무엇을 의미하는지 모르는 나에게 말한다 단일 스레드 및 하나의 코어는 단위 시간당 많은 메모리를 통해서만 채움 할 수 있습니다.

멀티 스레드 콜렉터 중 하나를 선택하기 만하면 일시 중지 시간이 짧아집니다.

그러나이 가설을 어떻게 모으는 지 (또는 알지 못하는) 나는 모른다. 어떤 파이널 라이저가 시간 소모적인지 찾는 방법.

일반적으로 : 더 많은 데이터를 수집하십시오. GC 관련 작업의 경우 GC 로깅을 활성화해야합니다. Java 코드 (응용 프로그램 또는 타사 라이브러리)에 소요되는 시간은 프로파일 러가 필요합니다.

+0

참고 : G1GC 가비지 컬렉터 –

+0

"직렬 수집기를 사용하는 경우"1) 직렬 수집기 란 무엇입니까? 2) 다른 것을 사용할 수 있다는 것을 의미합니까? 방법? –

+1

귀하의 질문에 * SerialOld *, 그건 G1GC와 상호 배타적이다. * 어떻게? * 오라클의 가비지 컬렉터 문서를 다루는 스택 오버 플로우에 대한 다른 답변이 많이 있습니다. – the8472