程序计数器
1.1定义
-
作用,是用于记住下一条jvm指令的执行地址
-
特点
- 线程私有的,就是每个线程都有自己的程序计数器
- 规定不会产生内存溢出
-
本质,程序计数器的本质就是一个寄存器,在jvm的二进制码转换成机器码的过程中,发挥作用。
虚拟机栈
-
定义
- Java Virtual Machine Stacks (Java 虚拟机栈)
- 每个线程都只能有一个虚拟机栈(线程私有),对应着当前执行的那个方法
-
作用
- 线程每当执行一个方法,就压入虚拟机栈中;每当执行完一个方法,就从中弹出。
-
思考
- 方法内的局部变量是否线程安全?
- 如果方法内局部变量,没有逃离方法的作用访问,它是线程安全的
- 如果是局部变量引用了对象,并且逃离方法的作用范围,需要考虑线程安全。
- 核心就是是否出现,多线程访问的情况出现。
- 方法内的局部变量是否线程安全?
-
栈内存的溢出
-
栈帧过多导致内存溢出(经常)
- 比如递归没有很好的规定结束条件时,会出现过多而导致溢出的问题。
-
栈帧过大导致栈的内存溢出
-
-
线程运行时诊断
-
用top定位那个进程出现(比如cpu占用过高)
-
ps H -eo pid,tid,% cpu | grep 进程id
-
jstack 进程id
- 可以根据线程的id找到有问题的线程,进一步定位到问题代码的源码行号
-