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

そして、私は次のように実行しています

[aniket@localhost 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期待していたように)。私は何が欠けていますか?ヒープダンプを取得するにはどうすればよいですか?

アップデート :

私は-XX:ErrorFile=.まだ役に立たなかった。上記の方法でヒープ ダンプ (JVM のクラッシュ) を取得できない場合、JVM をクラッシュさせてこれらのログを取得するにはどうすればよいですか?

4

6 に答える 6

1

下を見ると

Exception in thread "main" java.lang.OutOfMemoryError

これは、エラーまたは例外が例外ハンドラーによって処理されることを意味します。これはクラッシュではありません。

于 2013-08-30T07:38:09.040 に答える
1

Jmapを使う

jmap [options] pid

pid はアプリケーションのプロセス ID です

于 2013-08-30T07:17:38.183 に答える
0

Eclipse には素晴らしいHeap Analyzerがあります

また、jpsPID を取得してからjmapヒープ自体を取得するために使用できます。

JVM をクラッシュさせたい場合は、ネイティブ コードを使用することをお勧めします。

于 2013-08-30T07:18:12.393 に答える
0

ヒープ ダンプを取得するプロセス ID を見つけます。

ps -ef | grep java

上記のコマンドを実行して PID を取得したら、以下のコマンドを実行してヒープ ダンプを生成します。

jmap -dump:format=b,file=<fileName> <java PID>
于 2018-04-18T17:22:44.810 に答える