目录
- 程序计数器
- 1:作用:
- 2:特点:
- 1:线程私有
- 2:内存不会溢出
- 栈
- 1:介绍:
- 2:问题辨析:
程序计数器
1:作用:
程序计数器的作用就是记录下一条jvm指令的执行地址,由解释器读取,物理上的结构是寄存器;
具体是这样的:首先将java源代码编译成二进制字节码,二进制字节码就是一些jvm指令,然后解释器会将jvm指令解释成机器码再由cpu读取,而解释器就是从程序计数器获取下一条jvm命令的执行地址。
2:特点:
1:线程私有
线程通过cpu的调度器来调度,调度器分给线程时间片,当时间片结束的时候会切换到其他线程,所以每个线程都需要一个程序计数器来保存下一条jvm的执行地址。故程序计数器是线程私有的,每个线程都有自己的程序计数器;
2:内存不会溢出
栈
1:介绍:
栈是一个线程运行时所需要的内存空间;
栈帧:一个方法运行所需要的内存空间;
方法执行:方法1执行,栈帧1入栈,方法1调用方法2,栈帧2入栈,方法2调用方法3,栈帧3入栈,栈帧3执行完结果返回给方法2,方法2执行完结果再返回给方法1;依次出栈
2:问题辨析:
首先第一个问题:垃圾回收不会涉及到栈内存,因为栈帧执行完出栈会自动释放内存;
第二个问题:栈内存分配的越大越好嘛?并不是,因为栈内存是每个线程占用的内存大小,如果栈内存变大,总内存不变,那么线程数量会变少。我们可以通过-xss参数来设置栈内存大小,linux和mac默认的栈内存的大小都是1mb;
第三个问题:判断局部变量是否线程安全就是要确定这个变量是每个线程私有的还是共有的。如果不是static,那么因为每个线程都会单独开一个栈,多个线程不会有影响,如果是static,那么因为是公共的就会有线程安全问题;
第三个问题再加上扩展:
如果局部变量没有逃离方法的作用范围就是线程安全的。
如果局部变量逃离了方法的作用范围就是线程不安全的;