@frank-shaw
2015-10-29T11:09:05.000000Z
字数 1425
阅读 1995
java.类加载
在讲到类的初始化过程的第一个阶段:加载的时候。《深入理解Java虚拟机》一书中讲到了有且只有5种情况是必须立即对类进行“初始化”的,其中第一条就是:
遇到new getstatic putstatic invokestatic这4条字节码指令的时候,如果类没有初始化,那么需要触发其初始化。
于是我就开始疑惑“字节码指令”的含义了。查了一下网络,“字节码指令”的定义为:该指令由一个字节长度组成,代表某种特定含义的操作码。在Java中,字节码是JVM中具有可移植性的机器语言。
http://www.jb51.net/article/36407.htm 中讲到了较为详细的字节码指令集的使用以及一些规定。其中提到了:
看了一下,这些指令似乎都是未曾见过的,比较惊讶。其中提到的操作数栈与局部变量表又是什么东西呢?局部变量表我当然明白,但是这个操作数栈我就不懂了,于是又去百度,原来跟内存分配大有关系:
Java虚拟机运行时的内存划分(《深入理解Java虚拟机》第二章):
而Java虚拟机栈中包含了局部变量表和操作数栈。我们来细细看一下:
虚拟机栈描述的是Java方法执行的内存模型:一个线程中方法调用链可能会很长,很多方法都同时处于执行状态。对于执行引擎来讲,只有位于站定的栈帧才是有效的,称之为当前栈帧。每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
局部变量表是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。另外,在方法执行的时候,虚拟机使用局部变量表完成参数值到参数变量列表的传递过程(有些参数变量的值不在局部定义,那么此时就需要使用reference类型来完成局部变量表到队或方法区的参数传递过程)。
操作数栈正如它的名字所表述的,在这里执行的是方法所包含的字节码指令及与其相关的具体操作。方法内部过程的具体执行时在这里执行的。
上述两者所需要的容量大小都已经在编译程序代码的时候被完全确定。