2009-08-12 7 views
8

우리는 Java 5를 실행하는 서버 응용 프로그램을 오래 실행하고 프로파일 링하여 오래된 세대가 천천히 성장하는 것을 볼 수 있습니다. 전체 GC에서 올바르게 해제되었지만, 힙 덤프를 사용하여 Eclipse MAT에서 도달 할 수없는 객체를 볼 수 있기를 바랍니다. + XX : HeapDumpOnCtrlBreak를 사용하여 힙 덤프를 성공적으로 가져 왔지만 JVM은 힙을 덤프하기 전에 항상 GC를 수행합니다. 분명히 이것은 Java 6에서 발생하지 않지만 우리는 현재 5에 머물러 있습니다. 이것을 막을 수있는 방법이 있습니까?가비지 콜렉션없이 Java 5에서 힙 덤프를 수행하려면 어떻게해야합니까?

답변

1

YourKit과 같은 제 3 자 프로필러를 사용하면 GC를 먼저 시작하지 않고도 스냅 샷을 찍을 수 있습니다. 보너스를 추가하면 전체 ctrl-break shenanigans없이 스냅 샷을 찍을 수 있습니다.

+0

덕분에, 나는 실제로 JProfiler와의 복사본을 가지고 있지만, 나는이 작업을 수행 할 수 몰랐어요. 나는 그것을 줄 것이다. – Colin

3

프로그래밍 방식 JMX를 통해 힙 덤프를 취할 수 있습니다 여기에 몇 가지 코드를 가지고 :

링크 : JmxHeapDumper.java

소스 코드의 주석 힙을하는 방법에 대한 유용한 정보를 포함 기사 2 개 링크를 포함 우울. 확실하지는 않지만 운이 좋다면 아마도 JMX 접근 방식은 GC를 피할 수있는 방법이 될 것입니다. 희망이 도움이!

+0

좋아, 고마워, 내가 GC를 사전에 확인해 볼게. 프로그래밍 방식으로 할 수 있다는 것은 실제로 유용하게 보입니다. – Colin

4

JDK와 함께 제공되는 표준 jmap 도구를 사용해 보셨습니까? jmap는 수신자가 공식적으로 자바에서 도입 된 제

예시 명령 라인 : /자바/빈/jmap는 -heap : 형식 = B

결과는 표준 jhat를 도구 또는 GUI 애플리케이션으로 처리 될 수

MAT와 같은

9

jconsole 또는 visualvm 또는 jmc 또는 기타 jmx 관리 콘솔을 사용하십시오. com.sun.management의 HotSpotDiagnostic를여십시오. 선택 방법 dumpHeap 입력 두 개의 매개 변수 : 덤프 파일에

  • 경로는
  • 은 (는 true/false)를 만 라이브 개체를 덤프. false을 사용하여 모든 개체를 덤프하십시오.

덤프 파일은 JVisualVM이 아니라 연결된 JVM에 의해 기록되므로 JVM이 다른 시스템에서 실행중인 경우 해당 시스템에 기록됩니다.

enter image description here

+0

이것은 JDK에 포함 된 일반적인 도구를 사용하기 때문에 받아 들여진 대답이어야합니다. – mjuarez

+1

VisualVM은 이것을위한'VisualVM-MBeans' 플러그인이 필요합니다. – Natan