JVM

JVM高级特性-虚拟机执行引擎

Posted by YaPi on April 19, 2017

执行引擎

运行时栈帧结构

栈帧是用于支持虚拟机运行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。每一个方法的调用开始到执行完成都对应一个栈帧在虚拟机栈中入栈到出栈的过程。

avatar

  • 局部变量表

局部变量表是一组变量值的存储空间,用于存放方法参数和方法内定义的局部变量。局部变量表的容量已变量槽为最小单位,并没有指定一个变量槽的内存空间大小,而是说每个slot都应该能存放一个boolean、byte、char、short、int、float、reference、returnAddress类型的数据。在32位机器内为32位大小。64位虚拟机中还需要对齐和补白。

  • 操作数栈

是一个后入先出栈。同局部变量表一样,操作数栈的最大深度也在编译的时候写入到方法的Code属性max_stacks数据项中。操作数栈的每一个元素都是任意的java数据类型。比如一个加法运算,iadd指令运行的时候会将操作数栈顶的两个元素相加,再将结果入栈。

  • 动态连接

每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接。字节码中的方法调用指令就以常量池中指向方法的符号引用作为参数。这些符号引用一部分会在类加载阶段或者第一次使用的时候转化为直接引用,这种称为静态解析。这一部分主要是类的静态方法和私有方法、实例构造器、父类方法、final方法,他们在编译期就可确定,运行期不能被改变。另一部分在每一次运行期间转化为直接引用,这部分称为动态连接。

  • 方法返回地址

方法正常执行退出,返回到方法的调用者。这种退出方式叫正常完成出口。

遇到异常退出的方式,叫做异常完成出口。它是不会给它店调用者任何返回值的。

在正常完成退出时,会以调用者的pc计数器的值作为返回地址。异常退出时,返回地址要通过异常处理器表来确定。栈帧一般不会保存这部分信息。

虚拟机引擎架构

Tomcat

4组类库存储目录

  1. /common/*,类库可以被Tomcat和所有Web应用程序共享
  2. /server/*,可被Tomcat使用,其他web不可见
  3. /shared/*,可被所有server使用,Tomcat不可见
  4. /WebApp/WEB-INF/*,仅仅呗当前web服务使用

它的类加载器结构图如下:

        Bootstrap ClassLoader
                |
        Extension ClassLoader
                |
        Application ClassLoader
                |
        common类加载器,commonClassLoader
    /                       \
   Catalina类加载器         shared类加载器
                                |
                            webApp类加载器
                                 |
                            jsp类加载器

Jsp类加载器仅仅作用于当前jsp文件,当文件被修改过后,会替换掉当前的jsperLoader实力,并通过再建立一个新的jsp类加载器来实现文件的HotSwap功能