上一节了解完类加载机制后,继续学习JVM
HotSpot虚拟机是Sun/OracleJDK和OpenJDK中默认的Java虚拟机,也是目前使用范围最广的Java虚拟机。
一起学习一下Runtime Data Area吧~
Runtime Data Area(运行时数据区)
进程生命周期
以下这些区域存储的数据是被当前进程中所有线程所共享的,所以这些数据是非安全性的
- MethodArea(方法区)
- 又称Class Template类模板,存放类对象,常量,静态变量
- Heap(堆)
- 存放的是class对象(new ThreadDemo())对象实例
线程生命周期
存活时间是和线程绑定一期的,每个线程都有以下三个区域,这些区域数据是私有的,线程安全的
- Java虚拟机栈
- 一个方法被执行,一个栈桢就会被创建
- 由于栈是先进后出,所以限制性的方法一定是结束于后执行的方法
- 栈中的每一个元素被称为栈桢
- 局部变量表(存储局部变量,如果是类方法,下标从0开始,如果是普通方法,下标从1开始,0存储的是this)
- 操作数栈(存、取数据)
- 动态链接(符号引用转换成直接引用 [非常量池])
- 方法的返回地址(正常或者异常)
思考:如果add方法是一个递归方法,会被压栈几次呢?当然是多次!
- 本地方法栈
- 执行native方法的栈(native修饰的方法)
- 程序计数器
- Java虚拟机可以支持多线程同时执行,每一个Java虚拟机线程都会有自己的PC Register,为了记录执行的位置。PC Register记录当前线程执行的方法所在的地址。下一次就可以从这个地址获取内容继续执行了。
问题
不管是栈还是堆,都是有大小的,不够的情况怎么办?
- 对这些区域进行垃圾回收。
- 如果回收不掉,或者依然不够,抛出OOM 异常,堆的话还会抛出StackOverFlowError。