线程中堆栈和如何获取线程堆栈

堆和栈有什么不同:

  • 每个线程都有自己的栈内存(栈帧),用于存储本地变量,方法参数和栈调用,一个线程中存储的变量对其它线程是不可见的。
  • 而堆是所有线程共享的一片公用内存区域
  • JDK1.6+引入了逃逸分析,对象都在堆里创建,为了提升效率线程会从堆中弄一个缓存到自己的栈,如果多个线程使用该变量就可能引发问题,这时volatile 变量就可以发挥作用了,它要求线程从主存中读取变量的值

如何在Java中获取线程堆栈

对于不同的操作系统,有多种方法来获得Java进程的线程堆栈。当获取线程堆栈时,JVM会把所有线程的状态存到日志文件或者输出到控制台。

  • 在Windows可以使用Ctrl + Break组合键来获取线程堆栈。
  • Linux下用kill -3命令。也可以用jstack这个工具来获取,它对线程id进行操作,可以用jps这个工具找到id。
  • 通过使用 jps 检查当前正在运行的JAVA进程的 PID。jps –lvm
  • 使用明确的 PID 作为 jstack 的参数来获取 thread dumps。jstack -f 5824。一般用于死锁的分析和线程执行速度很慢时的分析
  • -Xss参数用来控制线程的堆栈大小

线程中堆栈和如何获取线程堆栈

上一篇:JVM调优总结


下一篇:linux下xsync和xcall脚本及使用xcall jps遇到的一些小问题