浅谈虚拟机(2)受害者和凶手登场の内存详解
本来想要在一篇博客中写完对象创建的所有内容。但是发现对象创建并不是三言两语可以写完,因此改为一个系列博客。而JVM有一个非常重要的功能便是对对象的管理,因此正好借对象创建的例子,来一点一点盘剥虚拟机的神奇之处。
类在内存中的加载分为两步,第一步是类加载,第二步是内存分配。在讲这两步之前先对内存区域进行讲解。
JVM(Java Virtual Mechine)内存区域
上图是JVM运行时数据区。
本文主要讲解方法区、堆、虚拟机栈。通常大家会以堆和栈来简单理解JVM,其中的栈就是虚拟机栈,而堆则是图中的堆和方法区。
虚拟机栈
虚拟机栈描述的是java方法调用和执行的内存模型。
栈帧:
每个java方法在执行的时候都会创建一个栈帧,该栈帧会用来存放局部变量表、操作数栈、动态链接、返回地址等信息。虚拟机栈中存放有多个栈帧,而方法的调用链可能很长,很多方法都处于执行状态。在活动线程中,只有处于栈顶的栈帧才是有效的,被称为当前栈帧,与这个栈帧相关联的方法成为当前方法。执行引擎运行的所有字节码指令都只针对当前栈帧进行操作。
局部变量表:
局部变量表是一组变量存储空间,用于存储方法实参和方法内部定义的局部变量(local variable)。在java进程被编译为class文件的时候,就根据方法的code属性中max_locals数据项分配了局部变量表所需的最大空间。详细内容在 浅谈虚拟机之局部变量表 中有详细讲述(URL:http://blog.****.net/qq_14885857/article/details/73359499)
操作数栈:
用来存放操作指令的区域:操作数;操作码。如1 + 2 这个操作,操作数是1和2,操作码是+。再如 i++,操作数是变量i,操作码是++。(URL:http://blog.****.net/qq_14885857/article/details/73518725)