0

我有一个使用spring native /graalvm的 spring-boot Web 应用程序。是否有可能获得此类应用程序的堆转储?我尝试使用:visual vm、jconsole、spring-actuator 但没有成功。这 3 个选项适用于非 Spring 原生应用程序。我只想比较 graalvm 应用程序和 vanilla 应用程序的堆利用率。

4

1 回答 1

1

您不能使用 jmap 或 visualVM 生成堆转储,但您可以实现代码块来生成堆转储。这是示例代码

import java.text.DateFormat;
import java.util.Date;

public class SVMHeapDump extends Thread {
    static int i = 0;
    static int runs = 60;
    static int sleepTime = 1000;
    @Override
    public void run() {
        System.out.println(DateFormat.getDateTimeInstance().format(new Date()) + ": Thread started, it will run for " + runs + " seconds");
        while (i < runs){
            System.out.println("Sleeping for " + (runs-i) + " seconds." );
            try {
                Thread.sleep(sleepTime);
            } catch (InterruptedException ie){
                System.out.println("Sleep interrupted.");
            }
            i++;
        }
    }
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws InterruptedException {
        StringBuffer sb1 = new StringBuffer(100);
        sb1.append(DateFormat.getDateTimeInstance().format(new Date()));
        sb1.append(": Hello GraalVM native image developer! \nGet PID of this process: ");
        sb1.append("'ps -C svmheapdump -o pid= '\n");
        sb1.append("then send it signal: ");
        sb1.append("'kill -SIGUSR1 <pid_printed_above>' \n");
        sb1.append("to get heap dump generated into working directory.\n");
        sb1.append("Starting thread!");
        System.out.println(sb1);
        SVMHeapDump t = new SVMHeapDump();
        t.start();
        while (t.isAlive()) {
            t.join(0);
        }
        sb1 = new StringBuffer(100);
        sb1.append(DateFormat.getDateTimeInstance().format(new Date()));
        sb1.append(": Thread finished after: ");
        sb1.append(i);
        sb1.append(" iterations.");
        System.out.println(sb1);
    }
}

构建并运行该代码后,您可以使用kill -SIGUSR1 100命令发送信号。

有关详细信息,请查看https://www.graalvm.org/reference-manual/native-image/NativeImageHeapdump/

于 2022-02-07T20:44:03.010 回答