execution engine:
  1. 运行时栈current stack frame主要保存了 local variable table, operand stack, dynamic linking, return address and some other additional info。
  2. 方法调用(确定调用哪个方法的过程):这类加载阶段就能够确定调用版本的符号应用,直接转化为方法的直接引用(方法在内存中的入口地址),这其中有四类方法:静态方法、私有方法、实例构造器<init> 和 父类方法,这类方法也统称为非虚方法,其他的方法都称为虚方法(除去final修饰的方法)。
  3. 静态分派(Static dispatch,典型应用method overload resolution):静态分派是依赖静态类型来定位方法执行版本的分派动作,它发生 在编译阶段,因此确定分派的动作不是由虚拟机执行的。在确定方法的重载版本时,很多时候匹配的方法并不唯一,往往只能确定一个“更合适”的版本(因为字面量没有显示的静态类型)。
  4. 动态分派(典型应用:override):多态,即 Java虚拟机根据对象引用的实际类型确定方法版本的过程,实际对应invokevirtual指令的多态查找过程。具体步骤:1)找到操作数栈顶元素所指向对象的实际类型,记作C。2)如果找到与常量中的描述符和简单名称都相符的方法,则进行访问权限的校验,通过则返回直接引用;否则,返回java.lang.IllealAccessError异常。3)否则,按照继承关系从下往上依次对C的父类进行过程2。4)如果还没找到,抛出java.lang.AbstractMethodError。
  5. 目前,Java语言是一门静态多分派、动态单分派的语言。
       早期(编译期)优化:com.sun.tools.javac.main.JavaCompiler类是编译的入口,下面是该类的主体代码。
try {
      738             initProcessAnnotations(processors);//初始化插入式注解处理器
      739
      740             // These method calls must be chained to avoid memory leaks
      741             delegateCompiler = processAnnotations(//执行注解处理
                                                     enterTrees( stopIfError(//输入到符号表
parseFiles(sourceFileObjects))),//词法分析和语法分析
      742                                                   classnames);
      743
      744             delegateCompiler.compile2();//分析和字节码生成
      745             delegateCompiler.close();
      746             elapsed_msec = delegateCompiler.elapsed_msec;
      747         }
方法compiler2:
      760     private void compile2() {
      761         try {
      762             switch (compilePolicy) {
      763             case ATTR_ONLY:
      764                 attribute(todo);
      765                 break;
      766
      767             case CHECK_ONLY:
      768                 flow(attribute(todo));
      769                 break;
      770
      771             case SIMPLE:
      772                 generate(//生成字节码
                                  desugar(//解语法糖
flow(//数据流分析
attribute(//标注
todo))));
      773                 break;
语法糖(Syntactic sugar)是一种编程语言中添加的某种语法,它对语言的功能并没有影响,但是更方便程序员的使用,并增加程序的可读性,减少出错的机会。Java中与之相关的有:泛型、自动装箱拆箱、遍历循环和条件编译。
 
 
 
我有看了一遍Dynamic Code Evolution for  Java 这篇文章。   下面写一下阅读总结:
  1. introduction部分介绍了DSU的四个方面的应用:Debugging(本文主要就是这个目的),Sever Application(Jvolve 的应用目标),Dynamic language(改进的VM课可以更容易的支持动态语言),Dynamic AOP。这篇文章的contribution:修改了HotSpot VM使之能够完成DCE; 
    在不增加新模块,不损失VM性能的前提下,允许 arbitrary changes ;
     一个更新可以在任意Java程序可以被suspend的地方执行;
     可以把修改过的HotSpot VM与使用JDWP协议的IDE集成。
  2. levels of code evolution: 方法体的修改; 增删方法; 增删域; 增删父类 (越往后, 实现的复杂度越高)
  3. 实现时,使用JDWP中的一个特殊命令来启动更新的过程。结合HotSpot VM的内部实现,主要修改了garbage collector, system dictionary and class metadata(这些修改不会影响到Java program的正常执行)。 具体过程是:                    寻找受影响的类,按照继承的拓扑结构排序; 建立 side universe(在垃圾回收中修改受影响的object时,用于中转);然后就是实际的修改pointer,update instance; state invalidation。
  4. 对于binary incompatible change(Fields, methods的删除,父类的修改引起的old code的失效),DCE 要么会抛出异常, 要么 直接导致VM突然终止。 作者给出理由是: 面向debug的,这两种情况都可以接受,而且找到了错误的来源(比什么现象都没有要好)。
  5. 有效性测试,对正常程序影响的测试,围观基准程序测试(比较效率)
  6. Related work: 在6.4java中提到了Jvolve,由于应用场景的不同,Jvolve 不允许binary incompatible change的存在,因此Jvolve 对更新点的选择更为严苛,对更新的类型也减少了 (class hierarchy不允许改变)。
 

JVM执行引擎总结(读《深入理解JVM》) 早期编译优化 DCE for java的更多相关文章

  1. 第 12 章 JVM执行引擎

    目录 第 12 章 执行引擎 1.执行引擎概述 1.1.执行引擎概述 1.2.执行引擎工作过程 2.Java 代码编译和执行过程 2.1.解释执行和即时编译 2.2.解释器和编译器 3.机器码 指令 ...

  2. 进入JVM的世界:《深入理解JVM虚拟机》-- 思维导图

    进入JVM的世界:<深入理解JVM虚拟机>-- 思维导图 之前一直都是零零散散的看了些JVM的知识,心想这样不行啊!于是便抽空看了一下这本神书,阅罢,醍醐灌顶.豁然开朗.真正的是知其然,更 ...

  3. JVM性能优化系列-(5) 早期编译优化

    5. 早期编译优化 早起编译优化主要指编译期进行的优化. java的编译期可能指的以下三种: 前端编译器:将.java文件变成.class文件,例如Sun的Javac.Eclipse JDT中的增量式 ...

  4. JVM执行引擎

    1.概述 执行引擎是jvm核心组成部分之一,建立在物理器,硬件和操作系统层面之上,引擎在执行代码时会有解释执行和编译执行两种选择,输入字节码文件,字节码解析输出结果. 2.栈帧 栈帧是用于支持虚拟机进 ...

  5. 深入分析JVM执行引擎

    程序和机器沟通的桥梁 一.闲聊 相信很多朋友在出国旅游,或者与外国友人沟通的过程中,都会遇到语言不通的烦恼.这时候我们就需要掌握对应的外语或者拥有一部翻译机.而笔者只会中文,所以需要借助一部翻译器才能 ...

  6. 小师妹学JVM之:深入理解JIT和编译优化-你看不懂系列

    目录 简介 JIT编译器 Tiered Compilation分层编译 OSR(On-Stack Replacement) Deoptimization 常见的编译优化举例 Inlining内联 Br ...

  7. 图解JVM执行引擎之方法调用

    一.方法调用 方法调用不同于方法执行,方法调用阶段的唯一任务就是确定被调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程.Class文件的编译过程中不包括传统编译器中的连接步骤,一 ...

  8. JVM执行引擎的执行过程

    摘自深入分析java web技术内幕

  9. JVM 专题十五:执行引擎

    1. 执行引擎概述 1.1 执行引擎 1.2 概述 执行引擎是Java虚拟机的核心组成部分之一. 虚拟机是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处 ...

随机推荐

  1. hdu 5237 二进制

    很无聊的模拟题...mark几个有用的小程序: 字符->二进制ASCII码 string tobin(char c) { string t; ; i<; i++) { t=+)+t; c/ ...

  2. PHP扩展编写、PHP扩展调试、VLD源码分析、基于嵌入式Embed SAPI实现opcode查看

    catalogue . 编译PHP源码 . 扩展结构.优缺点 . 使用PHP原生扩展框架wizard ext_skel编写扩展 . 编译安装VLD . Debug调试VLD . VLD源码分析 . 嵌 ...

  3. 在c#中用指针操作图片像素点

    在Bitmap类中有两个函数SetPixel,GetPixel,分别用来设置或读取图片中指定点的颜色(这里发现了VS的一个错误,SetPixel的文档说明写的是“获取颜色”??). 当要对一幅图进行相 ...

  4. hihoCoder #1164 随机斐波那契

    时间限制:5000ms单点时限:1000ms内存限制:256MB描述 大家对斐波那契数列想必都很熟悉: $a_0 = 1, a_1 = 1, a_i = a_{i-1} + a_{i-2}, (i & ...

  5. 【转载】Linux启动过程

    转自:http://cizixs.com/2015/01/18/linux-boot-process 简介 我们都知道:操作系统运行的代码是在硬盘上的,最终要跑到内存和 CPU 上,才能被我们使用. ...

  6. JSP实现数据传递与保存

    业务逻辑: 1.登陆login.jsp 2.判断登陆是否成功check.jsp 3.登陆成功页面newsDetail.jsp 4.登陆失败转发到login.jsp 代码如下: <%@ page ...

  7. 【Alpha阶段】第一次线上会议

    会议信息 因编译作业ddl,暂时没有大进展,没有close的issue 时间:2016.11.07 19:00 时长:10min 地点:讨论组 类型:线上会议 NXT:2016.11.08 21:30 ...

  8. android toast几种使用方法

    toast经常会用到,今天做个总结,特别是自定义toast的布局,值得一看. 一.默认展示 // 第一个参数:当前的上下文环境.可用getApplicationContext()或this // 第二 ...

  9. MFC学习-第一课 MFC运行机制

    最近由于兴趣爱好,学习了孙鑫的MFC教程的第一课.看完视频了,自己便用visual studio 2010尝试了MFC编程,其中遇到了一些问题. 1.vs2010不像vs6.0那样可以新建一个空的MF ...

  10. linux中快速清空文件内容的几种方法

    这篇文章主要介绍了linux中快速清空文件内容的几种方法,需要的朋友可以参考下 $ : > filename $ > filename $ echo "" > f ...