2013-08-30 4 views
3

Я хочу собрать дамп кучи на JVM аварииКак свалить кучу кучи?

Так я написал простой код

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(); 
} 
} 

и я бегу его следующим образом

[[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, который я хотел, но там это не куча дампа в рабочем каталоге (например, hs_err_pidXXXX.log, которого я ожидал). Что мне не хватает? Как получить кучу кучи?

Update:

Я попытался -XX:ErrorFile=. еще никакой пользы. Если выше это не способ получить кучу кучи (Crash JVM), как я могу свернуть свою JVM, чтобы получить эти журналы?

+2

'hs_err_pidXXXX.log' создается только в случае сбоя JVM, а не приложения. –

+0

вы можете зарегистрировать дамп кучи, используя eclipse, чтобы узнать подробности http://stackoverflow.com/questions/837351/how-do-i-save-the-heap-dump-to-a-file-in-eclipse – Dileep

+0

Затем как я разбиваю свою JVM? Мне нужно сгенерировать этот файл. –

ответ

5

Вы сбиваете с пути ошибку или ошибку, возникающие при столкновении JVM.

JVM происходит сбой из-за внутренней ошибки в JVM, вы не можете вызвать это, написав обычную программу Java (или не следует, если вы нашли ошибку)

Что вы делаете, вызывая ошибку, которая означает, что программа продолжает выполняться до тех пор, пока не исчезнут все нинёмные потоки.

Простейшим инструментом для изучения кучи является VisualVM, который поставляется с JDK. Если вы хотите, чтобы вызвать дамп кучи на качестве OutOfMemoryError вы можете использовать -XX:+HeapDumpOnOutOfMemoryError

+0

На самом деле есть ошибка, и я пытаюсь ее воспроизвести! –

+2

@AniketThakur Ошибка в JVM или ваш код? Я предлагаю вам включить информацию об ошибке, поскольку это ваша настоящая проблема. –

+0

-XX: + HeapDumpOnOutOfMemoryError - это то, что я хотел. Благодаря! –

1

Использование Jmap

jmap [options] pid 

PID идентификатор процесса применения

0

Eclipse, имеет удивительный Heap Analyzer

Кроме того, вы можете использовать jps, чтобы получить PID, а затем jmap для кучи сам.

В случае, если вы хотите разрушить JVM, ваше лучшее предположение было бы родным кодом.

1

Когда вы видите ниже

Exception in thread "main" java.lang.OutOfMemoryError 

Это означает, что ваша ошибка или исключение обрабатывается обработчиком исключений. Это не крушение.