자바:내 코드의 어느 부분이 가장 많이 실행되고 있는지 어떻게 확인할 수 있나요?(프로파일링)

StackOverflow https://stackoverflow.com/questions/90176

문제

저는 Java로 간단한 체커 게임을 작성하고 있습니다.보드 위로 마우스를 가져가면 프로세서 속도가 최대 50%(코어에서는 100%)까지 올라갑니다.

이 동안 내 코드의 어떤 부분(내 잘못이라고 가정)이 실행되고 있는지 알고 싶습니다.

디버깅을 시도했지만 이 경우 단계별 디버깅이 잘 작동하지 않습니다.

내 문제가 어디에 있는지 알려줄 수 있는 도구가 있나요?현재 이클립스를 사용하고 있습니다.

도움이 되었습니까?

해결책

이것을 "프로파일링"이라고 합니다.귀하의 IDE에는 아마도 다음 중 하나가 함께 제공될 것입니다.보다 Java의 오픈 소스 프로파일러.

다른 팁

프로파일러를 사용하세요(예: 당신의 키트 )

프로파일링 중이신가요?어떤 IDE를 사용하시는지는 모르겠지만, Eclipse에는 괜찮은 프로파일러가 있습니다. 또한 다음 위치에 일부 오픈 소스 프로파일러 목록이 있습니다. 자바 소스.

간단히 말해서, 프로파일러 프로그램의 어느 부분이 얼마나 자주 호출되는지 알려줄 것입니다.

나는 내 프로그램에 대한 프로필을 많이 작성하지 않아서 경험이 많지는 않지만 넷빈즈 IDE 제가 테스트할 때 프로파일러를 사용했습니다.(저는 보통 Eclipse도 사용합니다.Eclipse의 프로파일링 기능도 살펴보도록 하겠습니다.)

NetBeans 프로파일러는 어떤 스레드가 얼마나 오랫동안 실행되었는지, 어떤 메서드가 얼마나 오랫동안 호출되었는지 알려주고 각 메서드에 소요된 시간을 보여주는 막대 그래프를 제공합니다.그러면 어떤 방법이 문제를 일으키는지에 대한 힌트를 얻을 수 있습니다.다음을 살펴보실 수 있습니다. 자바 프로파일러 궁금하다면 NetBeans IDE가 제공하는 내용을 살펴보세요.

프로파일링은 일반적으로 프로그램의 어떤 부분이 실행 시간을 많이 차지하는지 측정하는 데 사용되는 기술로, 최적화 수행이 프로그램 성능을 높이는 데 도움이 되는지 여부를 평가하는 데 사용할 수 있습니다.

행운을 빌어요!

1) 그것은 당신의 잘못입니다 :)

2) Eclipse 또는 netbeans를 사용하는 경우 프로파일링 기능을 사용해 보십시오. 코드가 어디에서 많은 시간을 소비하는지 매우 빠르게 알려줄 것입니다.

3) 실패하면 내부 루프가 있다고 생각되는 곳에 콘솔 출력을 추가하십시오. 빨리 찾을 수 있어야 합니다.

예, 다음과 같은 도구가 있습니다.코드를 프로파일링해야 합니다.당신은 시도 할 수 있습니다 TPTP 일식에서 또는 아마도 시도 JProfiler.그러면 무엇이 호출되고 얼마나 자주 호출되는지 확인할 수 있습니다.

프로파일러를 사용하세요.많이있다.목록은 다음과 같습니다. http://java-source.net/open-source/profilers.예를 들어 다음을 사용할 수 있습니다. JIP, 자바로 코딩된 프로파일러입니다.

클로버 각 라인과 브랜치의 적중 횟수를 보여주는 멋진 보고서를 제공합니다.예를 들어, 이 줄 7번 처형됐다.

Eclipse, Maven, Ant 및 IDEA용 플러그인을 사용할 수 있습니다.그것은 오픈 소스에는 무료, 또는 다음을 얻을 수 있습니다. 30일 평가판 라이선스.

Sun Java 6을 사용하는 경우 최신 JDK 릴리스는 다음과 함께 제공됩니다. JVisualVM bin 디렉토리에 있습니다.이것은 사용하는 데 거의 노력이 필요하지 않은 유능한 모니터링 및 프로파일링 도구입니다. 특별한 매개변수를 사용하여 프로그램을 시작할 필요도 없습니다. JVisualVM은 단순히 현재 실행 중인 모든 Java 프로세스를 나열하고 사용하려는 프로세스를 선택합니다. .

이 도구는 어떤 방법이 모든 프로세서 시간을 사용하고 있는지 알려줍니다.

더 강력한 도구가 많이 있지만 먼저 무료 도구를 사용해 보세요.그런 다음 사용할 수 있는 다른 기능에 대해 읽으면 해당 기능이 어떻게 도움이 될 수 있는지 알게 될 것입니다.

이는 일반적으로 '높은 CPU' 문제입니다.

높은 CPU 문제에는 두 가지 종류가 있습니다.

a) 스레드가 하나의 코어의 100% CPU를 사용하는 경우(이것이 귀하의 시나리오입니다)

b) 특정 작업을 실행할 때 CPU 사용량이 '비정상적으로 높습니다'.이러한 경우 CPU 성능이 100%는 아니지만 비정상적으로 높아질 수 있습니다.일반적으로 이는 XML 구문 분석, 직렬화 역직렬화 등과 같은 코드에서 CPU 집약적인 작업이 있을 때 발생합니다.

사례 (a)는 분석하기 쉽습니다.30초 간격으로 100% CPU 5-6 스레드 덤프가 발생하는 경우.활성("실행 가능" 상태)이고 동일한 메소드 내에 있는 스레드를 찾으십시오(스레드 스택을 모니터링하여 이를 유추할 수 있음).아마도 'busy wait'가 표시될 것입니다(예제는 아래 코드 참조).

while(true){
  if(status) break;
  // Thread.sleep(60000); // such a statement would have avoided busy wait
}

사례 (b)는 동일한 간격으로 수행된 스레드 덤프를 사용하여 분석할 수도 있습니다.운이 좋다면 문제 코드를 찾을 수 있을 것이고, 스레드 덤프를 사용하여 문제 코드를 식별할 수 없다면.프로파일러를 사용해야 합니다.내 경험상 YourKit 프로파일러는 매우 훌륭합니다.

나는 항상 스레드 덤프를 먼저 시도합니다.프로파일러는 최후의 수단일 뿐입니다.80%의 경우에는 스레드 덤프를 사용하여 식별할 수 있습니다.

또는 JUnit 테스트 케이스와 일부 공통 구성 요소에 대한 코드 적용 도구를 사용하세요.다른 구성 요소를 호출하는 구성 요소가 있는 경우 해당 구성 요소가 더 많이 실행되는 것을 빠르게 확인할 수 있습니다.

저는 JUnit 테스트 케이스와 함께 Clover를 사용하지만, 오픈 소스의 경우 EMMA가 꽤 좋다고 들었습니다.

단일 스레드 코드에서 다음과 같은 몇 가지 문을 추가하는 것을 발견했습니다.System.out.println("A:"+ System.currentTimeMillis());프로파일러를 사용하는 것만큼 간단하고 효과적입니다.문제를 일으키는 코드 부분을 곧 좁힐 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top