`
leonmau
  • 浏览: 103093 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JVM Method Table

    博客分类:
  • Java
 
阅读更多

方法表

为了提高访问效率,必须仔细的设计存储在方法区中的数据信息结构。除了以上讨论的结构,jvm的实现者还可以添加一些其他的数据结构,如方法表。jvm对每个加载的非虚拟类的类型信息中都添加了一个方法表,方法表是一组对类实例方法的直接引用(包括从父类继承的方法)。jvm可以通过方法表快速激活实例方法。(译者:这里的方法表与C++中的虚拟函数表一样,但java方法全都是virtual的,自然也不用虚拟二字了。正像java宣称没有指针了,其实java里全是指针。更安全只是加了更完备的检查机制,但这都是以牺牲效率为代价的,个人认为java的设计者始终是把安全放在效率之上的,所有java才更适合于网络开发)

 

一个例子

为了显示jvm如何使用方法区中的信息,我们据一个例子,我们

看下面这个类:

class Lava {

     private int speed = 5; // 5 kilometers per hour

     void flow() {

     }

}

 

class Volcano {

     public static void main(String[] args) {

         Lava lava = new Lava();

         lava.flow();

     }

}

下面我们描述一下main()方法的第一条指令的字节码是如何被执行的。不同的jvm实现的差别很大,这里只是其中之一。

 

为了运行这个程序,你以某种方式把“Volcano"传给了jvm。有了这个名字,jvm找到了这个类文件(Volcano.class)并读入,它从类文件提取了类型信息并放在了方法区中,通过解析存在方法区中的字节码,jvm激活了main()方法,在执行时,jvm保持了一个指向当前类(Volcano)常量池的指针。

 

注意jvm在还没有加载Lava类的时候就已经开始执行了。正像大多数的jvm一样,不会等所有类都加载了以后才开始执行,它只会在需要的时候才加载。

 

main()的第一条指令告知jvm为列在常量池第一项的类分配足够的内存。jvm使用指向Volcano常量池的指针找到第一项,发现是一个对Lava类的符号引用,然后它就检查方法区看lava是否已经被加载了。

 

这个符号引用仅仅是类lava的完整有效名”lava“。这里我们看到为了jvm能尽快从一个名称找到一个类,一个良好的数据结构是多么重要。这里jvm的实现者可以采用各种方法,如hash表,查找树等等。同样的算法可以用于Class类的forName()的实现。

 

当jvm发现还没有加载过一个称为"Lava"的类,它就开始查找并加载类文件"Lava.class"。它从类文件中抽取类型信息并放在了方法区中。

 

jvm于是以一个直接指向方法区lava类的指针替换了常量池第一项的符号引用。以后就可以用这个指针快速的找到lava类了。而这个替换过程称为常量池解析(constant pool resolution)。在这里我们替换的是一个native指针。

 

jvm终于开始为新的lava对象分配空间了。这次,jvm仍然需要方法区中的信息。它使用指向lava数据的指针(刚才指向volcano常量池第一项的指针)找到一个lava对象究竟需要多少空间。

 

jvm总能够从存储在方法区中的类型信息知道某类型对象需要的空间。但一个对象在不同的jvm中可能需要不同的空间,而且它的空间分布也是不同的。(译者:这与在C++中,不同的编译器也有不同的对象模型是一个道理)

 

一旦jvm知道了一个Lava对象所要的空间,它就在堆上分配这个空间并把这个实例的变量speed初始化为缺省值0。假如lava的父对象也有实例变量,则也会初始化。

 

当把新生成的lava对象的引用压到栈中,第一条指令也结束了。下面的指令利用这个引用激活java代码把speed变量设为初始值,另外一条指令会用这个引用激活Lava对象的flow()方法。

分享到:
评论

相关推荐

    Apress.Exploring.Java.9.Build.Modularized.Applications.in.Java.1484233298

    Table of Contents Chapter 1: Introduction Chapter 2: The Module System Chapter 3: jshell Chapter 4: Collections, Stream, and Optional Chapter 5: The Process API Chapter 6: The Platform Logging API and...

    深入java虚拟机(inside the java virtual machine)

    The CONSTANT_InterfaceMethodref_info Table The CONSTANT_NameAndType_info Table Fields Methods Attributes The Code Attribute The ConstantValue Attribute The Exceptions Attribute The Inner...

    jad 最新版java反编译

    Options: -a - generate JVM instructions as comments (annotate) -af - output fully qualified names when annotating -b - generate redundant braces (braces) -clear - clear all prefixes, including the ...

    Crafting a Compiler by Charles N. Fisher Richard J. LeBlanc 带目录版

    10.2.3 JVM Instructions 401 10.3 Static Single Assignment Form 410 10.3.1 Renaming and φ-functions 411 10.4 Exercises 414 11 Code Generation for a Virtual Machine 417 11.1 Visitors for Code ...

    word源码java-java-knowledge-collection:Java核心知识点梳理

    目录(Table of Contents) Java Core Java 基础 Java 进阶 JVM 虚拟机 Java 并发 Java 集合 List 系列 Queue 系列 Map 系列 Set 系列 Java 框架 Servlet Spring Spring Bean 生命周期 Kafka ... 设计模式 创建型 ...

    jad.exe+readme.txt

    -a - annotate the output with JVM bytecodes -af - same as -a, but output fully qualified names when annotating; -clear - clear all prefixes, including the default ones (can be abbreviated as -cl) ...

    jsp探针 ver0.1

    jsp探针ceshi.jsp ; charset=gb2312" %> class LfSpy { boolean supportHibernate = false; boolean supportJNDI = false;...boolean supportJavaxSql = false;...private final String linuxParseMacAddress(String ...

    java反编译工具FrontEnd和jad

    -a - annotate the output with JVM bytecodes (default: off) -af - same as -a, but output fully qualified names when annotating -clear - clear all prefixes, including the default ones (can be ...

    Java反编译软件JAD1

    -nolvt - ignore Local Variable Table information -nonlb - don't output a newline before opening brace (default: do) -o - overwrite output files without confirmation (default: no) -p - send ...

    java反编译工具jad 1.5.8g(可以反编译jdk1.5,1.6)

    List of the command-line options. <br>Jad accepts the following options: <br> -a - annotate the output with JVM bytecodes (default: off) -af - same as -a, but output fully qualified names ...

    CommonsWare.The.Busy.Coders.Guide.to.Android.Development.Version.8.2.2017

    Table of Contents Preface Key Android Concepts Choosing Your Development Toolchain Tutorial #1 - Installing the Tools Android and Projects Tutorial #2 - Creating a Stub Project Getting Around Android ...

    JavaSE-6.0-英文手册(2008/11/30_FullUpdate)

    javax.swing.table javax.swing.text javax.swing.text.html javax.swing.text.html.parser javax.swing.text.rtf javax.swing.tree javax.swing.undo javax.tools javax.transaction javax.transaction.xa...

    最新Java面试宝典pdf版

    2. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。 83 3、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? 否则的话提示用户并终止提交? 84 4、...

    net学习笔记及其他代码应用

    答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。 40.接口是否可...

    Java面试笔试资料大全

    2. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。 83 3、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? 否则的话提示用户并终止提交? 84 4、...

    Java面试宝典2010版

    2. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。 3、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? 否则的话提示用户并终止提交? 4、请写...

    Java面试宝典-经典

    2. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。 83 3、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? 否则的话提示用户并终止提交? 84 4、...

    JAVA面试宝典2010

    2. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。 83 3、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? 否则的话提示用户并终止提交? 84 4、...

    java面试题大全(2012版)

    2. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。 83 3、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? 否则的话提示用户并终止提交? 84 4、...

    java面试宝典2012

    2. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。 90 3、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? 否则的话提示用户并终止提交? 91 4、...

Global site tag (gtag.js) - Google Analytics