源代码底层过程?
java 源代码 转为 二进制字节码 ;
二进制字节码再通过解释器 转为机器码 提供给CPU
1.0 程序计数器
通过寄存器 来实现的
记录下一条jvm指令的执行地址; 解释器铜锅程序计数器 重写回到 字节码中。
特点:
- 线程私有的 (不同的线程 有不同的程序计数器; 线程私有 不会有并发问题;随着线程创建和销毁)
- 不会存在内存溢出的问题
2.1 虚拟机栈 (栈帧 每个方法运行时所需要的内存 )
- 栈帧 : 参数,局部变量 , 返回地址
垃圾回收 是否涉及栈内存?
不涉及 ; 只处理堆内存。
栈内存分配越大越好吗?
默认是 1024 ; win 则依赖于虚拟内存。
栈内存越大 ,线程数会变少。 总内存不变,内存越大数量越少。
方法内的局部变量是否线程安全
- 如果方法内局部变量没有逃离方法的作用访问,他是线程安全的。
- 如果局部变量引用了对象,并逃离方法的作用方法,需要考虑线程安全。
变量对于线程是共享的 还是私有的?
一个线程对应一个栈帧 (对应新的局部变量);
eg: static 是共享的 ; 会有线程安全的问题
什么样的程序是线程不安全的
- sb 左边作为传参 可能会有共享的情况发生 ,所以线程不安全给
2.2 栈内存溢出
- 栈帧过多导致栈内存溢出(一般情况 )
- 栈帧过大导致栈内存溢出
P14 https://www.bilibili.com/video/BV1yE411Z7AP/?p=14&spm_id_from=pageDriver&vd_source=bd84b89816165ae4cd7858db2371f153