2013-08-30 4 views
3

나는 힙 덤프를 가져 오는 방법?

그래서 내가

[[email protected] Desktop]$ java -cp . -Xms2m -Xmx2m Test 
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
    at Test.execute(Test.java:15) 
    at Test.main(Test.java:25) 

내가 원하지만 OutOfMemoryError가있어 다음과 같이

public class Test { 
private String name; 

public Test(String name) { 
    this.name = name; 
} 

public void execute() { 

    Map<String,String> randomData = new HashMap<String,String>(); 
    for(int i=0;i<1000000000;i++) { 
     randomData.put("Key:" + i,"Value:" + i); 
    } 
} 

public void addData() { 
} 

public static void main(String args[]) { 
    String myName = "Aniket"; 
    Test tStart = new Test(myName); 
    tStart.execute(); 
} 
} 

과 내가 그것을 실행하고 간단한 코드를 작성 JVM 충돌에 힙 덤프를 수집 할이 작업 디렉토리 (예 : hs_err_pidXXXX.log)에 힙 덤프가 없습니다. 내가 뭘 놓치고 있니? 힙 덤프를 얻으려면 어떻게해야합니까?

업데이트 :

나는 여전히 사용 -XX:ErrorFile=.을 시도하지 않습니다. 위의 방법으로 힙 덤프 (크래시 JVM)를 얻지 못하면 어떻게하면 JVM에서 크롤링하여 로그를 얻을 수 있습니까?

+2

'hs_err_pidXXXX.log'는 애플리케이션이 아니라 JVM이 충돌 할 때 생성됩니다. –

+0

당신은 일식을 사용하여 힙 덤프를 기록 할 수 있습니다 자세한 내용은 여기 http://stackoverflow.com/questions/837351/how-do-i-save-the-heap-dump-to-a-file-in-eclipse – Dileep

+0

그런 다음 내 JVM은 어떻게 충돌합니까? 그 파일을 생성해야합니다. –

답변

5

예외 또는 JVM 충돌로 던져지는 오류를 혼동스럽게합니다.

| JVM 충돌 인해 JVM에서 내부 오류가 발생, 당신은 일반 자바 프로그램을 작성하여이를 실행할 수 없습니다 (또는 당신이 버그를 발견하지 말아야하지 않는 한)

당신이 오류를 트리거되어 일을하는 모든 비 데몬 스레드가 종료 될 때까지 프로그램이 계속 실행됨을 의미합니다.

힙을 검사하는 가장 간단한 도구는 JDK와 함께 제공되는 VisualVM입니다. 당신이 OutOfMemoryError를에 힙 덤프를 트리거 할 경우 그것은 의미

Exception in thread "main" java.lang.OutOfMemoryError 

아래에있는 귀하의 오류 또는 예외가 예외 핸들러에 의해 처리됩니다 볼 때 당신은 -XX:+HeapDumpOnOutOfMemoryError

+0

사실 버그가 있으며 그것을 재현하려고합니다! –

+2

@AniketThakur JVM 또는 코드의 버그? 이것이 당신의 진짜 문제이기 때문에 당신이 버그의 세부 사항을 포함시킬 것을 제안합니다. –

+0

-XX : + HeapDumpOnOutOfMemoryError는 내가 원했던 것입니다. 감사! –

1

사용 Jmap

jmap [options] pid 

PID는 응용 프로그램의 프로세스 ID입니다

0

이클립스 당신은 힙에 대한 다음 jmap를 PID를 얻을 수 jps을 사용하고 있습니다, 또한 멋진 Heap Analyzer

있다 그 자체.

JVM을 중단시키려는 경우 가장 좋은 추측은 기본 코드입니다.

1

를 사용할 수 있습니다. 이것은 충돌이 아닙니다.