最近发现在使用jstack工具在导出Java应用的线程栈时有一个小小的窍门,比如Linux环境上有一个用户为appuser,假如以这个用户启动了一个Java进程B,如果想要导出进程B的线程栈,则必须切换到账号appuser下执行jstack命令才能提取到应用的栈信息,使用其它账号登录Linux执行jstack命令来导出进程B的线程栈都会失败,即便root账号进行此类操作也会失败。具体原因没有找到,但至少知道jstack命令在使用时有这样的限制。
根据之前走读OpenJDK源码得到的信息,jstack命令在导出栈信息时其实主要工作都由JVM来完成的,jstack命令仅仅是向JVM发送了请求,栈数据其实由JVM生成的,jstack命令只负责接收并写入到标准输出。最近项目事情特别多,没有时间去细想,这里先记下来,待以后有机会分析一下JDK的源码,希望有进一步的收获。