jvm虚拟机

trigger [ˈtrɪɡə(r)] 触发器; 引爆器; 触发; 开动; 起动;
delegate [ˈdelɪɡeɪts]代表;授(权);委托;选派
initiate [ɪˈnɪʃieɪt , ɪˈnɪʃiət] 开始; 发起; 创始;

Core Case
start ---> bootstrap class loader  ---> rt.jar  ---> initial class ---> public class ---> void mian() ---> link other class or interface ---> …

The Run-Time Constant Pool
全局常量池、class常量池、
每一个虚拟机、只有一个全局常量池、存放的是字符串常量的引用值。
运行时常量池中的符号引用是从类或接口的二进制表示形式的结构派生的.
运行时常量池中的所有引用最初都是符号性的. 类在解析之后,将符号引用替换成直接引用,与全局常量池中的引用值保持一致.
运行时常量值从类或接口的二进制表示形式中的CONSTANT_Integer_info,CONSTANT_Float_info,CONSTANT_Long_info或CONSTANT_Double_info结构派生。
/**
 *
 * <1> 访问的 static final 静态常量、编译阶段可以确定其值时,不会去加载定义它的类或接口、
 *
 * <2> 访问的 static final 静态常量、编译阶段无法确定其值是,会去加载定义它的类或接口,也会加载其父类和父接口,
 *         同时会链接初始化其父类,但不会链接和初始化其父接口。
 *
 */


类的主动使用7种情况:
- [x] 创建类的实例
- [x] 访问类或接口的静态变量、给静态变量赋值、
该静态变量 ----编译期间不能确定值/运行时才能完成赋值
- [x] 调用类的静态方法
- [x] 反射 ---- Class.forName()
- [x] 初始化类的子类
- [x] 虚拟机启动时被标记为启动类的类
- [x] JDK1.7开始提供的动态语言支持

加载(Loading)是查找具有特定名称的类类型或接口类型的二进制表示形式并从该二进制表示形式中创建类或接口的过程。
链接(Linking )是获取类或接口并将其组合到Java虚拟机的运行时状态以便可以执行的过程。
类或接口的初始化包括执行类或接口的初始化方法<clinit>.  该名称<clinit>由编译器提供. 不能直接用Java编程语言编写的程序中使用它.

5.3. Creation and Loading
- [x] 类或接口C的创建由另一个类或接口D触发,该类或接口D通过对其运行时常量池引用C。
- [x] 也可以通过某些Java SE平台类库中的调用方法D(例如反射)来触发类或接口的创建。

- [x] 如果C不是数组类,则通过使用类加载器加载C的二进制表示形式(类文件格式)来创建它。
- [x] 数组类没有外部二进制表示形式。它们是由Java虚拟机而不是由类加载器创建的。

- [x] 定义加载器 defining loader
- [x] 初始加载器 initiating loader

- [x] ClassLoader
- [x] BootstrapClassLoader
- [x] ExtClassLoader
- [x] AppClassLoader
- [x] user-defined class loader

java.lang.Object
       --- java.lang.ClassLoader
              --- java.security.SecureClassLoader
                      ---  java.net.URLClassLoader
                            --- sun.misc.Launcher$ExtClassLoader
                            --- sun.misc.Launcher$AppClassLoader


- [x] JDK 1.0.2版中仅提供了一个含有两个参数的类加载器版本,Oracle的Java虚拟机实现依靠它来链接已加载的类或接口。
- [x] 从JDK 1.1版开始,Oracle的Java虚拟机实现调用了类加载器的loadClass方法,加载类或接口。loadClass的参数是要加载的类或接口的名称
- [x] 从JDK 1.1版开始,Oracle的Java虚拟机还有一个loadClass方法的两个参数版本,其中第二个参数是一个布尔值,指示是否要链接该类或接口。
- [x] 从JDK 1.1版开始,Oracle的Java虚拟机实现直接Link链接类或接口,而无需依赖类加载器。


运行时-类或接口的确定:binary name 和 defining class loader
类或接口的运行时包package:package name 和 defining class loader

创建类或接口:
- [ ] 如果D是由引导类加载器定义的、那么用引导类加载器启动加载C
- [ ] 如果D是由用户自定义类加载器所定义的、那么就用用户自定义类加载器来启动加载C
- [ ] 如果是数组类、那么该数组类是有虚拟机创建的,创建过程中会用到D的定义类加载器
LinkageError、ClassNotFoundException、NoClassDefFoundError


如果虚拟机记录了L是类或接口C的启动加载器、则不需要为C创建加载器、
直接调用L的loadClass方法、方法返回值 Class<?>是创建的类或接口C、最后虚拟机记录L是C的初始加载器。

loadClass方法2种实现方式:
1. 创建字节数组、表示为C的ClassFile结构的字节、然后调用ClassLoader类的defineClass方法、
2. 类加载L可以将类或接口C的加载委托给其他类加载器L'、将参数N直接或间接传递给L'上的方法调用(通常是loadClass方法)来实现的

相同的名称、返回同一个Class对象、L1委托L2加载类或接口C、则L1和L2应该返回相同的Class对象

Loading Using the Bootstrap Class Loader
Loading Using a User-defined Class Loader
Creating Array Classes

获取当前类的ClassLoader   
    class.getClassLoader();
获取当前线程上下文的ClassLoader   
    Thread.currentThread().getContextClassLoader();
获取调用者的ClassLoader   
    DriverManager.getCallerClassLoader();

5.5. Initialization
在类的链接阶段、为类体中的字段赋予默认值
类的初始化阶段、为类体中的字段赋予初始值

类的初始化
- [ ] 指令new、getstatic、putstatic、invokestatic
- [ ] 第一次调用java.lang.invoke.MethodHandle实例
- [ ] 调用某些反射方法,如在Class或包java.lang.reflect
- [ ] 初始化类的子类时、类会初始化
- [ ] Java虚拟机启动时指定的初始类

每个类或接口C、有一个唯一的初始化锁 LC、从C到LC的映射是由Java虚拟机实现自行决定
LC 可以是C的Class对象、或者是与该Class对象关联的监视器



绑定是一种过程、对非java需要的支持、以便可以执行该功能.
虚拟机退出:System.exit(0)、Runtime.getRuntime().halt(status)

链接

链接类或接口包括验证和准备类或接口、它的直接父类、直接父接口、它的元素类型
解析这个类或接口中的符号引用时链接过程的可选部分


链接之前必须被成功加载过、初始化之前必须成功被验证及准备过
链接过程会涉及数据结构的内存分配、可能导致OutOfMemoryError异常


验证 verification
验证阶段、确保类或接口的二进制表示在结构上是正确的
验证过程、可能会导致某些额外的类或接口被记载进来、但不一定需要验证和准备
验证失败、VerifyError、LinkageError


准备 preparation
准备阶段、创建类或接口的静态字段、并赋予默认值、此阶段不执行任何字节码指令
初始化阶段、会有显式的初始化器初始化这些静态字段、所以准备阶段不进行初始化

解析 resolution
解阶段、根据运行时常量池里的符号引用来动态决定具体值的过程

以下指令符号引用执行常量池、执行需要对符号引用进行解析:
anewarray、checkcase、getfield、instanceof、nvokedynamic、
invokeinterface、invokespecial、invokestatic、invokevirtual
ldc、ldc_w、multianewarray、new、putfield、putstatic、

invokedynamic执行的解析结果取决于一个具体值-----绑定到该指令调用点的对象

类或接口D的运行时常量池符号引用的解析过程:
- [ ] 类或接口解析
    - D的定义加载器被用来创建常量池中符号引用的类或接口C
    - 查询失败、IllgalAccessError
- [ ] 字段解析
    - 先尝试在类或接口C中查找字段、
    - 再尝试在类或接口C的父类中查找字段
    - 如果具有相同字段名称及描述符则查找成功、否则递归查找直接父接口
    - 查询失败、NoSuchFieldError
- [ ] 普通方法解析
    - 如果C是接口、解析抛出异常IncompatibleClassChangeError
    - 否则、方法引用解析过程会检查C和它的父类中是否包含此方法
    - 否则、方法查找会尝试从C的父接口中缺定位所引用的方法
    - 查询失败、NoSuchMethodError
- [ ] 接口方法解析
    - 如果C不是接口、抛出IncompatibleClassChangeError
    - 否则、在接口C中查找签名相同的接口方法
    - 否则、在Object类中查找签名相同的接口方法
    - 否则、在接口C的具体超接口中查找签名相同的接口方法
    - 否则、在接口C的人以超接口中查找签名相同的接口方法
    - 否则、查询失败
- [ ] 方法类型、方法句柄解析
- [ ] 调用点限定符解析

解析过程中、任何情况下、对类或接口解析不成功先抛出异常、之后才抛出解析字段的异常或解析方法的异常

访问控制、方法覆盖


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350