运行时数据区
一个JVM进程对应一个方法区和堆,多个线程共享。
一个线程对应独立的栈,本地方法栈,程序计数器。
每个JVM只有一个Runtime实例,是运行时环境,相当于图上运行时数据区的框框。
JVM中的线程
Hotspot JVM的线程是内核级线程,内核线程:建立和销毁都是由操作系统负责、通过系统调用完成的。
虚拟机中,每个线程都与操作系统本地线程直接映射,java线程结束后,本地线程也会回收。
jmv有许多后台线程主要有:
虚拟机线程
周期任务线程
Gc线程
编译线程
信号调度线程
程序计数器(pc寄存器 program counter register)
jvm的pc寄存器是对物理机的pc寄存器的抽象
很小的一块内存空间,是运行速度最快的存储区域。
作用:存储指向下一条指令的地址,由执行引擎读取下一条命令。
字节码指令中,前面的1,2,3,4…序号叫偏移地址,存储在pc寄存器中。
OOM,全称“Out Of Memory”,翻译成中文就是“内存用完了”
pc寄存器面试问题
pc寄存器存储字节码指令地址有有什么用?
为什么使用pc寄存器记录当前线程的执行地址?
答:cup在不停切换各个线程,所以当切换回来的时候,要知道该线程执行到哪一条命令了
pc寄存器为什么设定线程私有的?
因为每个线程都有自己的执行进度,当前字节码指令地址各不相同,所以每个线程独立pc寄存器
cpu时间片
cpu分给每个线程执行的时间。线程是并发执行的。
并行:多条路同时进行
串行:一条路依次进行
并发:一条路交替进行
虚拟机栈
java的指令根据栈来设计的
栈的优点是:指令集小,编译器容易实现
缺点:性能下降,实现同样功能需要更多指令,执行性比寄存器差
栈是运行时的单位,堆是存储的单位
形象理解:栈好比菜谱,堆好比锅,锅里有对象。
一个线程有一个栈,栈的内部保存着一个个栈帧,一个栈帧保存一个方法
随线程创建和停止
方法执行时入栈,方法结束时出栈
栈不存在垃圾回收问题
开发中遇到哪些异常
Stack OverflowError异常:线程请求分配的栈容量超过了虚拟机允许栈最大容量
outOfMemoryError异常:没有足够的内存去创建虚拟机栈
设置栈大小(调优)
-Xss命令修改栈的大小,详情看视频。