1. JVM的内存结构
JVM的内存结构主要包括五个部分:程序计数器、虚拟机栈、本地方法栈、堆和方法区,其中程序计数器、虚拟机栈、本地方法栈是线程独有的,而堆和方法区是线程共享的。
1.1 程序计数器(Program Counter Register)
程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。是为了线程切换后能恢复到正确的执行位置。如果线程正在执行的是一个Java方法,这个计数器指示的是正在执行的虚拟机字节码指令的地址;如果正在执行一个native方法,计数器则为空(Undefined)。
1.2 虚拟机栈(JVM Stacks)
每个栈由多个栈帧组成,当执行一个方法时会创建一个栈帧,方法的调用到结束对应了栈帧的入栈到出栈,每个栈中同一时间只有一个活动栈帧:即同一时间线程中只有一个方法在执行。
栈由多个栈帧组成,栈帧中存放了局部变量表、操作数栈、动态链接和方法出口等信息。
1.2.1 栈内存溢出
当出现递归程度很深的程序时,栈一直进行入栈操作,内存可能会耗尽,此时会出现StackOverFlowError的错误。
public void stackError(int i){
i++;
stackError(i);
}
public static void main(String[] args) {
new StackError().stackError(1);
}
可以使用-Xss256K来设置栈帧的大小
1.3 本地方法栈(Native Method Stacks)
本地方法:不由java代码编写的方法,用native关键字修饰,不给出实际的方法实现体,大多由操作系统提供。
本地方法栈和虚拟机栈的功能类似,不同点是本地方法栈为本地方法服务。
2.1 堆(Heap)
主要存放对象实例。
2.1.1 特点
①:线程共享;
②