有没有一种在JVM上程序化地检查堆栈内容(包括值和值的类型以及当前指令点)的方法(即使它是供应商特定的)?
例如,我想要检查当前的激活帧并提取它所属的方法名称,以及堆栈变量。此外,我还想能够以这种方式迭代激活帧。
这可能吗?乍一看,JVMTI 似乎允许这样做,但它是作为本机接口使用的。显然已经使用它来实现可以执行这些操作的Java库,但这似乎有点过时。我想知道是否有集成到JVM API或其他跨平台JVM库的解决方案。
有没有一种在JVM上程序化地检查堆栈内容(包括值和值的类型以及当前指令点)的方法(即使它是供应商特定的)?
例如,我想要检查当前的激活帧并提取它所属的方法名称,以及堆栈变量。此外,我还想能够以这种方式迭代激活帧。
这可能吗?乍一看,JVMTI 似乎允许这样做,但它是作为本机接口使用的。显然已经使用它来实现可以执行这些操作的Java库,但这似乎有点过时。我想知道是否有集成到JVM API或其他跨平台JVM库的解决方案。
Thread.currentThread().getStackTrace()
有什么问题吗?就像这里指出的一样:stack overflow comment
看看这个页面: http://download.oracle.com/javase/7/docs/webnotes/tsg/TSG-VM/html/tools.html
他们列出了一个jstack实用程序:
此实用程序可以从Java进程中获取Java和本地堆栈信息。在Solaris OS和Linux上,该实用程序还可以从核心文件或远程调试服务器获取信息。请参见2.11 jstack实用程序。
我从未使用过它,但我使用过随jdk一起提供的Visual VM工具。
希望有所帮助, 詹姆斯
Continuation.suspend
运算符时才这样做。 - axel22continueWith
,那么它可能只在被要求时保存堆栈。我担心性能问题,这就是为什么我问的原因。但似乎 Javaflow 在类加载期间对字节码进行了处理。我以为处理会在运行时(类加载后)进行,只有在需要时才会进行。我想知道,如果每个方法都被处理,那么性能会受到什么影响。 - axel22