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