2017-04-21 2 views
2

클래스를 프로파일 링하려고합니다. 사용자의 데이터를 저장하고 나중에 가져 오는 버퍼와 같습니다. main 메소드를 생성하고 테스트 메소드를 끝없이 순환시킵니다. Java Mission Control 공백은 무엇을 의미합니까?

public void test(){ 
     buffer.add(n1); 
     Message message = buffer.remove(); 
     msgSeqNum = message.getMsgSeqNum(); 
    } 

msgSeqNum

는 내 전화를 (그것이 나를 도울 수 내가 생각하는) 제거하지 JVM에 위해를했습니다, 글로벌 변수입니다.

나는 30 초 동안 프로파일 링을하고 있었지만, 필자의 코드는 약 40 회 실행되었다 (나는 수천 개를 예상했다). 또한 JMC에서 공백을 보았습니다 (screenshot 참조). JVM이 아무 것도하지 않았다는 것을 알 수 있습니다. GC, Exceptions, Look, 대기 시간 및 제 코드가 매우 빠르게 작동합니다.

여러 번 실행하려고했지만 동일한 결과가 나타났습니다. 왜 그렇게됩니까?

OS - 창

+0

프로파일 링 또는 샘플링을 수행 했습니까? – Kayaman

+0

운영체제를 의미합니까? 그것은 창문이었습니다 – ViKo

답변

2

(전체 고장 프로파일 반대) 샘플링 응용 프로그램은 프로파일 러는 특정 간격으로 검사 방법이 실행되고있는 것을 볼 수 있습니다. 이것은 모든 단일 호출을 추적하는 것보다 더 가볍습니다.

이는 또한 호출 횟수와 같은 항목에 대해 정확한 결과를 얻지 못했음을 의미합니다. 코드가 40 번만 실행되었다고 생각할 수도 있지만 실제로는 프로파일 러가 해당 메소드가 실행되었음을 감지 한 횟수입니다. 어떤 샘플도 채우지 않은 채 두 번째 시간이 오래 걸리는 것처럼 보이지만 샘플러는 실행 기회를 얻지 못했을 것입니다 (특히 단단한 루프가 있고 로우 엔드 머신에서 실행되는 경우).

샘플링은 정확한 호출 횟수를 제공하지 않지만 대부분의 시간과 CPU를 사용하는 방법을 결정하는 데 충분한 정보를 제공하므로 코드를 최적화 할 수 있습니다.

0

오버 헤드를 낮게 유지하기 위해 JFR 샘플 할당 및 메소드 호출이 너무 적습니다. 이것은 매 10ms마다 한 번씩 스택을 샘플링하고 모든 TLAB (스레드 로컬 할당 버퍼)에서 할당하거나 큰 개체가 할당 될 때 샘플링합니다.

JIT 컴파일러는 할당/호출을 제거 할 수도 있지만 대개 발생하기 전에 40 개를 초과하는 호출이 필요합니다.

+0

JIT 컴파일러가이 줄을 입력했기 때문에 호출을 제거했다고 생각하지 않습니다 msgSeqNum = message.getMsgSeqNum(); msgSeqNum은 전역 변수입니다. 나는 이것이 제거를 피하는 것이 올바른지 확신하지 못합니다. 어떻게 생각하십니까? – ViKo

관련 문제