아무 작업도 하지 않을 때 CPU를 소비하는 Java 애플리케이션이 있는 경우 해당 애플리케이션이 수행 중인 작업을 어떻게 확인합니까?

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

  •  08-06-2019
  •  | 
  •  

문제

공급업체의 Java API를 호출하고 있는데 일부 서버에서는 API에 로그인한 후 JVM이 낮은 우선순위 폴링 루프에 들어가는 것 같습니다(CPU 사용량 100%).다른 서버의 동일한 앱에서는 이러한 동작이 나타나지 않습니다.이는 WebSphere와 Tomcat에서 발생합니다.환경 설정이 까다로워서 Eclipse 내에서 프로파일링 같은 작업을 시도하기가 어렵습니다.

Tomcat에서 실행 중인 기존 Java 앱을 프로파일링(또는 다른 검사 방법)하여 이러한 스핀 대기 상태에 있는 동안 어떤 메서드가 실행되고 있는지 확인할 수 있는 방법이 있습니까?앱은 이 상태에 있을 때 하나의 메서드(공급업체 메서드)만 실행하고 있습니다.공급업체는 (물론) 동작을 복제할 수 없습니다.


업데이트:

JConsole을 사용하여 누가 실행 중이고 무엇을 하고 있는지 확인할 수 있었습니다.왜 그 일을하는지 알아내는 데 몇 시간이 걸렸습니다.문제는 사용 중인 공급업체의 API jar가 사용 중인 데이터베이스 구성과 정확히 일치하지 않는다는 것입니다.구성이 약간 일치하지 않는 서버에서는 추적 및 성능 모니터링이 기본적으로 활성화되어 있었습니다.다른 병을 사용했는데 모두 괜찮습니다.

답변해 주셔서 감사합니다, 조슈아님.JConsole은 설치가 매우 쉽고 기존 애플리케이션을 모니터링하는 데 사용됩니다.

@Cringe - 귀하가 제안한 옵션 중 일부를 실험해 보았습니다.JProfiler를 설정하는 데 몇 가지 문제가 있었습니다. 보기에는 좋아 보이지만 비용이 많이 듭니다.앞으로는 Eclipse 프로파일러 플러그인을 추가하고 기능을 비교하기 위해 다양한 오픈 소스 프로파일러를 살펴볼 것입니다.

도움이 되었습니까?

해결책

Java 5 이상을 사용하는 경우 다음을 사용하여 애플리케이션에 연결할 수 있습니다. j콘솔 실행 중인 모든 스레드를 보려면jstack은 또한 스택 덤프를 수행합니다.나는 이것이 Tomcat과 같은 컨테이너 내부에서도 여전히 작동할 것이라고 생각합니다.

이 두 도구는 모두 JDK5 이상에 포함되어 있습니다. (프로세스가 Java 5 이상이어야 한다고 가정하지만 틀릴 수도 있습니다.)

업데이트:JDK 1.6 업데이트 7부터 이제 다음과 같은 번들 프로파일러가 있다는 점도 주목할 가치가 있습니다. VisualVM 'jvisualvm'으로 시작할 수 있습니다.그것은 다음과 같습니다 java.net 프로젝트, 이므로 해당 페이지에서 추가 정보를 확인할 수 있습니다.나는 이것을 아직 사용하지 않았지만 더 심각한 분석에 유용할 것 같습니다.

도움이 되었기를 바랍니다

다른 팁

내가 사용한 것과 동일한 문제에 직면 YourKit 프로파일러.로더는 실제로 연결하지 않는 한 활성화되지 않습니다(연결을 수신하기 위해 포트를 열긴 하지만).프로파일러 자체에는 덜 눈에 띄는 모드에서 작업하면서 "각 방법에 소요된 시간을 가져오는" 기능이 훌륭합니다.

또 다른 방법은 우선 순위가 가장 높은 "watchdog" 스레드에서 CPU 로드(JNI를 통해 이를 위해 외부 라이브러리가 필요함)를 감지하고 CPU가 오랫동안 충분히 높을 때 모든 스레드 로깅을 시작하는 것입니다.당신은 찾을 수 있습니다 이 기사 계몽.

전문적인 목적이고 쓸 돈이 있다면 손을 뻗어 보세요. JProfiler.단지 몇 가지 통찰력을 얻고 싶다면 다음을 시도해 보십시오. Eclipse 프로파일러 플러그인.여러번 사용했는데 현재 상태는 잘 모르겠습니다.

Eclipse 프로젝트 자체의 새(?) 프로젝트도 사용할 수 있습니다. http://www.eclipse.org/tptp/ (보다 이 기사).사용해본 적이 없어서 노력할 가치가 있는지 알 수 없습니다.

다음 사이트에는 매우 유용한 오픈 소스 프로파일러 목록도 있습니다. http://www.manageability.org/blog/stuff/open-source-profilers-for-java

JRockit 임무 제어 대기 시간 분석기.

JRockit과 함께 제공되는 대기 시간 분석기는 JVM이 아무 작업도 하지 않을 때 "수행"하는 작업을 보여줍니다.최신 버전에서는 다음에 대한 지연 시간을 확인할 수 있습니다.

  • Java 대기/차단/절전/주차.
  • 파일 I/O
  • 네트워크 I/O
  • 메모리 할당
  • GC 일시중지
  • JVM 대기 시간(예: 코드 생성 및 클래스 로딩)
  • 스레드 서스펜션

이 도구는 대기 시간이 발생했을 때 스택 추적을 제공합니다.다양한 방법(집계 추적, 히스토그램, 스레드 그래프 등)으로 대기 시간 데이터를 볼 수 있습니다.또한 이 도구를 사용하면 한 스레드가 다른 스레드에 알리는 경우와 같이 스레드 간 전환을 확인할 수 있습니다.

대기 시간 분석기 http://blogs.oracle.com/hirt/WindowsLiveWriter/The.0LatencyAnalyserMigratedfromtheoldBE_7246/latency_graph_2.png

오버헤드는 무시할 수 있으며 다른 많은 도구와 달리 프로덕션 환경에서 사용할 수 있습니다.이것 블로그 게시물 간단한 소개를 제공하고 프로그램을 다운로드할 수 있습니다. 여기.

개발에 무료로 사용할 수 있습니다!

JConsole을 사용할 수 없는 경우 다음을 수행할 수 있습니다.

  • 누르다 CTRL 키+부서지다 Windows에서
  • 보내다 kill -3 <process id> 리눅스에서

전체 스레드 덤프를 얻으려면.이는 성능에 영향을 주지 않으며 항상 프로덕션 환경에서 실행될 수 있습니다.

프로파일러를 사용하세요. 예, 비용이 많이 들고 사용하는 것이 때때로 다소 어색할 수 있지만 추측보다는 훨씬 더 실제적인 증거를 제공합니다.

인간은 어디에서 성능 병목 현상이 발생하는지 추측하는 능력이 전반적으로 좋지 않습니다.그것은 단지 우리의 두뇌가 잘 할 수 있도록 만들어지지 않은 것 같습니다.당연한 것처럼 보일 수도 있고, 문제가 무엇인지에 대한 훌륭한 아이디어를 갖고 있을 수도 있지만, 현실 세계에서는 종종 다른 일을 하고 있는 것으로 드러납니다.그리고 코드의 잘못된 부분을 최적화한다는 것은 최소한의 이익을 위해 많은 작업을 수행한다는 것을 의미합니다.더 자주 작업이 느려지고 때로는 작업이 완전히 중단될 수도 있습니다.따라서 최적화를 위해 변경하기 전에 다음을 수행해야 합니다. 언제나 프로파일러나 기타 정확한 도구를 통해 실제 증거를 확보해야 합니다.

앞서 언급했듯이 JProfiler와 YourKit은 둘 다 꽤 훌륭하고 가격도 엄청나게 비싸지 않습니다.지난번에 봤더니 둘 다 무료 데모도 있었어요.

완전성을 위해:우리 회사는 Eclipse를 어느 정도 표준화했지만 Netbeans(6 이상)을 사용합니다. 포함됨, 무료 프로파일러 매일.이는 Eclipse TPTP 플러그인(3개월 전에 마지막으로 확인)보다 더 잘 작동하며 우리에게는 JProfiler와 같은 상업용 프로파일러가 필요하지 않습니다. 이는 훌륭하지만 빠르게 불필요해지고 있습니다.

VisualVM은 독립형으로 netbeans의 프로파일러여야 합니다.나는 Eclipse를 위해 TPTP를 시도했지만 VisualVm이 훨씬 더 좋은 옵션인 것 같습니다!

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