Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JVM堆栈内省_Java_Jvm_Stack_Introspection - Fatal编程技术网

Java JVM堆栈内省

Java JVM堆栈内省,java,jvm,stack,introspection,Java,Jvm,Stack,Introspection,是否有一种方法可以在JVM上以编程方式检查堆栈的内容(包括值和值的类型以及当前指令点)(即使它是特定于供应商的) 例如,我想检查当前激活框架并提取它所属的方法名以及堆栈变量。此外,我希望能够以这种方式迭代激活帧 这可能吗?乍一看,似乎允许这样做,但其目的是用作本机接口。显然,它一直在实现一个Java库来完成这些事情,但这似乎有点过时了。我想知道是否有一个集成到JVM api中的解决方案,或者其他跨平台JVM库允许这样做。我找到的最接近的解决方案是将带有局部变量的堆栈保存为对象。您还可以使用它将堆

是否有一种方法可以在JVM上以编程方式检查堆栈的内容(包括值和值的类型以及当前指令点)(即使它是特定于供应商的)

例如,我想检查当前激活框架并提取它所属的方法名以及堆栈变量。此外,我希望能够以这种方式迭代激活帧


这可能吗?乍一看,似乎允许这样做,但其目的是用作本机接口。显然,它一直在实现一个Java库来完成这些事情,但这似乎有点过时了。我想知道是否有一个集成到JVM api中的解决方案,或者其他跨平台JVM库允许这样做。

我找到的最接近的解决方案是将带有局部变量的堆栈保存为对象。您还可以使用它将堆栈恢复到保存状态。

有什么问题吗
Thread.currentThread().getStackTrace()
?正如这里所指出的:

我相信这就是您要寻找的。

查看此页面:

它们列出了一个jstack实用程序:

此实用程序可以从Java进程获取Java和本机堆栈信息。在Solaris OS和Linux上,该实用程序还可以从核心文件或远程调试服务器获取信息。参见2.11 jstack实用程序

我从未使用过它,但我使用了jdk附带的可视化虚拟机工具

嗯,,
詹姆斯

谢谢,这个看起来不错。我想知道Javaflow是否急切地将堆栈上下文保存到continuation对象中(即每次调用一个新方法或continuation操作符时),或者仅在调用操作符
continuation.suspend
时才会这样做。我想只有在调用时才会这样做,否则恢复就没有多大用处了通过
恢复
您的意思是
继续
。啊,是的,如果可以多次使用
continueWith
,那么它可能只在被要求时保存堆栈。我关心的是表现,这就是为什么我问。但Javaflow似乎在类加载期间对字节码进行了检测。我认为在需要时,插装将在运行时(类加载之后)发生。我想知道,如果每个方法都被检测,性能会有什么影响。我想知道的唯一方法是尝试它。没有参数:)我会尝试!这不包括堆栈上的变量这更适合于调试目的,因为它只返回源代码行、类的名称和被调用的类的方法,而不是堆栈框架的实际内容。正确,如果您还需要变量,请使用此API。这里是主页的链接:谢谢您给出这个答案!