行时内存
一个jvm实例对应一个Runtime对象
jvm的线程与本地操作系统的线程直接映射
程序计数器
(the pc register),cpu只有把数据加载到寄存器才能够运行,JVM中的寄存器是对物理PC 寄存器的一种抽象模拟。
只是存储下一条指令地址
虚拟机栈
可以通过 -Xss来设置栈的预定大小,-Xss1m = -Xss1024k=-Xss1048576
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200603104803130.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMTM3MDM2,size_16,color_FFFFFF,t_70
returnAddress 类型的值是指向字节码的指针,不管是物理机还是虚拟机,运行时内存中的数据总归可分为两类:代码,数据。对于冯诺依曼结构的计算机,指令数据和数值数据都存储在内存中,而哈弗结构的计算机,将程序指令与数据分开存储。
对于 JVM 来说,程序就是存储在方法区的字节码指令,而 returnAddress 类型的值就是指向特定指令内存地址的指针。
JVM支持多线程,每个线程有自己的程序计数器(pc register),而 pc 中的值就是当前指令所在的内存地址,即 returnAddress 类型的数据,当线程执行 native 方法时,pc 中的值为 undefined。
————————————————
版权声明:本文为CSDN博主「墨城之左」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/antony1776/article/details/898431
对于最后一个问题,如果局部参数都是封闭的那就是线程安全的
//注意,StringBuffer,本身是线程安全的,StringBuilder是线程不安全的
public void test1(){
StringBuilder s_bu = new StringBuilder("abc");
s_bu.append("a");
s_bu.append("b");
}
//这里是线程安全的,因为s_bu没有传出去,也不是从外部接收的
public void test1(StringBuilder s_bu){
s_bu.append("a");
s_bu.append("b");
}
//这就是线程不安全的,因为从外部传过来的资源,外部可以访问的