随笔分类 - JVM
摘要:最近复习JVM的知识,对于静态分派和动态分派的理解有点混乱,于是自己尝试写写代码,在分析中巩固知识。 有如下一段代码,请问每一段分别输出什么? 下面我简单地介绍一下从代码编译到方法调用的整个过程。 · 编译 先看看第1段输出,child.foo()是调用父类还是子类的静态方法呢? 在编译阶段,发生了
阅读全文
摘要:1. 动态分派 一个体现是重写(override)。下面的代码,运行结果很明显。 最终输出sub : f(); 那么虚拟机是怎么做到动态分派的呢? 不同的虚拟机有不同的实现,最常用的是使用虚方法表(Virtual Method Table) 2. 虚方法表 对于Super和Sub类,虚方法表大致如下
阅读全文
摘要:分派(Dispatch)可能是静态也可能是动态的,根据分派依据的宗量数可分为单分派和多分派。这两种分派方式的两两组合就构成了静态单分派,静态多分派,动态单分派,动态多分派这4种组合。本章讲静态分派。 1.静态分派 所有依赖静态类型来定位方法执行版本的分派动作称为静态分派。静态分派的典型应用是方法重载
阅读全文
摘要:方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还没有涉及到方法内部的具体运行过程。在程序运行时,进行方法调用是最普遍最频繁的操作,但Class文件的编译过程不包含传统编译中的连接步骤,一切方法调用在Class文件里存储的都只是符号引用,而不是方法
阅读全文
摘要:初始化是类加载过程的最后一步,但由于比较重要,故放在前面先讲。 在前面的连接(准确来说是准备)阶段,类的变量已经被赋予默认值(如int类型为0,布尔类型为false,引用类型为null等)。而在初始化阶段,则根据程序员通过程序制定的主观计划去初始化类变量和其他资源。或者可以从另一个角度来表达:初始化
阅读全文
摘要:1. 类的生命周期 虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading),验证(Verification
阅读全文