java虚拟机,简称JVM,是执行java字节码文件的操作系统进程。
JVM的内存模型分为五大部分,分别是虚拟机栈,本地方法栈,程序计数器,堆和方法区。其中虚拟机栈,本地方法栈,程序计数器是线程私有的,也就是每个线程都有这三部。而堆和方法区是所有线程共享的。
1、程序计数器
程序计数器就是记录当前线程执行到的位置,也就是下一条需要执行的指令。
2、虚拟机栈
虚拟机栈是线程运行的核心。每调用一个方法的时候,就会创建一个栈帧并压入虚拟机栈中,每个栈帧中会存在一个局部变量表和操作数栈,用于存放在执行方法时的变量、参数和中间结果。
3、本地方法栈
本地方法栈和虚拟机栈类似,存放native方法调用的状态。
4、堆
堆内存存放的是对象,及new出来的对象。程序中对象往往是最多的,所以堆内存也是最大的。堆内存也分为两个部分,一个是新生代,另外一个是老年代,新生代存放的是短时间存在的对象,而老年代则相反。默认情况下新生代和老年代的空间大小比例为1:2。新生代也分为两个个部分,分别是Eden和survivor,而survivor又分为Fromsurvivor和Tosurvivor,也就是新生代分为Eden,Fromsurvivor,Tosurvivor,其大小比例默认为8:1:1,这样分的好处是gc更快的回收内存。
5、方法区
方法区用于存放加载的java类信息、静态变量、final类型的常量、属性和方法。