堆和栈有什么不同:
- 每个线程都有自己的栈内存(栈帧),用于存储本地变量,方法参数和栈调用,一个线程中存储的变量对其它线程是不可见的。
- 而堆是所有线程共享的一片公用内存区域
- 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参数用来控制线程的堆栈大小