jvm运行时数据区分为:
1.方法区: 属于共享区域, 存储已被虚拟机加载得类信息,常量静态变量
2.虚拟机栈: 线程私有,与线程生命周期一样每个方法被执行得时候java虚拟机会创建一个栈帧,栈帧包括局部变量表,方法返回地址,动态链接等信息,为java方法服务
3.本地方法栈: 为native方法服务(实体实现语言非java)
4. 堆: jvm所管理得内存中最大得一块(后面会详细讲解)
5. 程序计数器: 空间小,运行快,线程私有,其中存储着需要执行指令得字节码指令
PC寄存器
- 每个线程独立私有,存储着字节指令地址,在同一时刻,一条java虚拟机线程只会执行一个线程方法代码,这个正在被执行的方法被称为该线程当前方法. 如果不是native方法,那么pc寄存器就保存虚拟机正在执行的字节码指令地址,如果是native方法,那么pc寄存器存储的就是undefined. pc寄存器最小容量应该能存储一个returnAddress的数据
- ReturnAddress类型
- returnAddress 类型的值就是指向特定指令内存地址的指针,列如程序计数器pc中的值
- returnAddress 类型在 Java 语言之中并不存在相应的类型,也无法在程序运行期间更改
- returnAddress 类型的值。
Java虚拟机
- 每条线程创建时,java虚拟机栈中会创建一个相对应的栈,用来存储栈帧(栈帧存储局部变量表,操作数栈,动态链接,方法出口等信息)
- java虚拟机规范规定java虚拟机栈可以被设定为固定大小或者根据计算机动态扩展或者收缩
堆(Heap)
- java虚拟机所管理的内存最大的一块区域,线程共享,类实例和数组对象分配的区域
- 垃圾收集器管理的主要区域
- 容量可以固定大小,也可以进行动态扩展和收缩
- returnAddress 类型的值就是指向特定指令内存地址的指针,列如程序计数器pc中的值
- returnAddress 类型在 Java 语言之中并不存在相应的类型,也无法在程序运行期间更改
- returnAddress 类型的值。
- 每条线程创建时,java虚拟机栈中会创建一个相对应的栈,用来存储栈帧(栈帧存储局部变量表,操作数栈,动态链接,方法出口等信息)
- java虚拟机规范规定java虚拟机栈可以被设定为固定大小或者根据计算机动态扩展或者收缩
堆(Heap)
- java虚拟机所管理的内存最大的一块区域,线程共享,类实例和数组对象分配的区域
- 垃圾收集器管理的主要区域
- 容量可以固定大小,也可以进行动态扩展和收缩
方法区
- 可被各条线程共享
- 可不连续,容量可固定,也可动态扩展和收缩
- 存储了每个类的结构信息,如运行时常量池,构造函数和普通方法的字节内容等
- 运行时常量池
- 每个运行时常量池都分配在Java虚拟机的方法去之中,在类和接口被加载到虚拟机后,对应的运行时常量池就会被创建出来.
- 具有动态性,
- 避免频繁创建和销毁对象影响系统性能
- 每个运行时常量池都分配在Java虚拟机的方法去之中,在类和接口被加载到虚拟机后,对应的运行时常量池就会被创建出来.
- 具有动态性,
- 避免频繁创建和销毁对象影响系统性能
本地方法栈
- native方法指的是Java以外的其他语言编写的方法
- 容量可以固定大小,也可以进行动态扩展和收缩
- 如果java虚拟机不支持native方法,也不需要传统方法栈,可以不创建本地方法栈;如果支持本地方法栈,那么这个栈一般会在线程创建的时候按线程分配
- java虚拟机实现可能会用到传统的栈来执行native方法,这个栈就是本地方法栈
- 当一个方法调用native方法时,由java虚拟机栈中的java方法栈帧调用,native栈帧接收
- 栈帧
- 用来存储数据和部分过程的结果的数据结构
- 百度百科经典解释:"栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构."
- 栈帧随着方法调用而创建,随着方法结束而销毁--无论方法是正常完成还是异常完成,都算结束.
- 栈帧容量仅仅取决去java虚拟机的实现和方法调用时可被分配的内存
- 栈帧是线程本地的私有数据,不可能在一个栈帧之中引用另一个栈帧
个人笔记以及总结



