介绍
- 一个 JVM 实例只存在一个堆内存,堆也是 Java 内存管理的核心区域。
- Java 堆区在 JVM 启动的时候即被创建,其空间大小也就确定了。是 JVM 管理的最大一块内存空间。
- 堆内存的大小是可以调节的。
- 《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。
- 所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)。
使用 native 关键字修饰的方法,就叫做本地方法。
举例栈溢出的情况?(StackOverFlowError)
-Xss
设置栈的大小后,当超出这个次数,就会报 SOF(StackOverFlowError)JVM-010-运行时数据区-虚拟机栈-方法返回地址(Return Address)
在JVM中,将符号引用转换为调用方法的直接引用与方法的绑定机制相关
当一个字节码文件被装载进JVM内部时,如果被调用的目标方法在编译期确定,且运行期保持不变时,这种情况下将调用方法的符号引用转换为直接引用的过程称之为静态链接
如果被调用的方法在编译期无法被确定下来,也就是说,只能够在程序运行期将调用的方法的符号转换为直接引用,由于这种引用转换过程具备动态性,因此也被称之为动态链接。
JVM-008-运行时数据区-虚拟机栈-动态链接(Dynamic Linking)
动态链接(Dynamic Linking)
,比如:invokedynamic 指令JVM-007-运行时数据区-虚拟机栈-操作数栈(Operand Stack)
栈的含义:先进后出,可以使用数组或链表来实现,但不具有数组或链表的特性(任意位置增删改等)
而操作数栈的含义:只是使用了数组来存储实现的栈,即按照顺序存放,有索引,但是并非采用访问索引的方式来进行数据访问的,只能通过入栈和出栈来操作数据
每一个独立的栈帧中除了包含局部变量表以外,还包含一个后进先出(Last-In-First-Out)
的操作数栈
,也可以称为 表达式栈(Expression Stack)
JVM-006-运行时数据区-虚拟机栈-局部变量表(Local Variables)
局部变量表也被称之为局部变量数组或本地变量表
定义为一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量,这些数据类型包括各类基本数据类型、对象引用(reference),以及returnAddress返回值类型。
由于局部变量表是建立在线程的栈上,是线程的私有数据,因此不存在数据安全问题
局部变量表所需的容量大小是在编译期确定下来的,并保存在方法的Code属性的maximum local variables数据项中。在方法运行期间是不会改变局部变量表的大小的。
可以通过反编译(javap -v XXX.class
)或者 jclasslib 插件看到: