JLS(Third Edition) Chapter12 Execution
这一章详细说明在一个program执行时,发生的activities。 它根据JVM和组成program的类、接口、实例的生命周期 组织。 一个JVM从加载一个特定的类并调用它的main方法开始启动。 12.1 给出了loading, linking, initialization的大致轮廓,接下来几个section 详细介绍。 这一章还给出了实例创建过程和类实例终结的详细规范,最后谈到类的卸载和program的退出。
12.1 Virtual Machine Start-up
java Test reboot Bob Dot Enzo // Test is a pulibc class name
执行这个命令,将会启动JVM,传递 “reboot” “Bob” “Dot” “Enzo”三个参数给Test的main方法,并调用它。这个其中完成了下面几件事:
- Load the Class Test (调用Test的静态方法导致Test类的加载)
- Link Test:Verification,Preparation and Resolution(最后一步根据JVM的不同策略,可以直接解引用,也可以等到真正调用的时候再解引用。原文P311说的the only requirement的意思是,解引用过程中发生的错误 必须在 真正使用这个引用之前 抛出,即提前抛出 或者 当时再抛出 都可以。stackoverflow上关于这个问题的讨论)
- Initialization:执行class variable initializer and static initializer(如果Test 有super class ,那么它的super class 必须先完成初始化)
- Invoke the Test.main
Loading of Classed and Interfaces , Verification of the Binary Representation, Preparation and Resolution这个也在另一篇文章JVMS chapter5中有详细的讲解.
类或接口T初始化的时机:
T 是一个类,一个T的实例被创建
T 是一个类,一个T的静态方法被调用
T 的一个静态 Field 被赋值
T 声明的一个 静态 Field 被 访问, 并且该Field 不是一个常量
T 是一个top-level 类,并 lexically 嵌套在 T 内的 一个断言语句被执行
(需要注意的是,对类的Field的访问,只导致 实际定义这个Field的类被初始化,子类不被初始化,即使是通过子类方法这个Field。 reference:P318)
12.5 Creation of New Class Instances
前面的工作做完以后,指定的构造函数就开始采用下面五个步骤初始化这个new object:
- 给构造函数传参数
- 如果这个构造函数开头是显示调用同一个类中的另外一个构造函数,那么就用同样的五步递归调用。如果这个递归过程中发生错误,本过程也以同样的错误结束,否则,转到步骤5.
- 这个构造函数头没有显示调用另外一个同一类的构造函数。如果这个构造函数所在类不是Object,那么构造函数会显示或隐式调用父类的构造函数。同样用这个五步递归调用。如果中间发生错误,本过程以同样原因结束,否则,转到步骤4
- 执行instance initializers 和 instance variable initializers,执行顺序与它们在源码中从左到右一样。如果执行过程中抛出异常,那么这个过程以抛出同样结束,否则 转到步骤5
- 执行这个构造函数的剩余部分。如果这个过程抛出异常,那么这个过程一抛出同样异常而结束,否则 这个过程到此正常结束。
12.6 Finalization of Class Instances 这个部分讲Object.finalize()的相关实现和使用,以及和Memory Model的交互问题
12.7和12.8 分别讲 Unloading of Classes and Interfaces 和 Program Exit
JLS(Third Edition) Chapter12 Execution的更多相关文章
- android开发系列之多线程
今天在这篇博客里面,我只想谈谈自己对程序开发里面避无可避的一个问题-多线程的一些看法与思考. 其实说到多线程这个名称相信只要接触过软件这个行业的人都已经耳熟能详了,但是如果被问到到底什么才是多线程呢? ...
- java Thread 接口学习
对于程序员来说 Thread应该都不会陌生,具体的接口调用不是本篇的重点.Thread的基本概念及接口的使用:java多线程 下面将更多的从底层实现角度讲一下Thread. Thread的声明如下: ...
- Object的wait/notify/notifyAll&&Thread的sleep/yield/join/holdsLock
一.wait/notify/notifyAll都是Object类的实例方法 1.wait方法:阻塞当前线程等待notify/notifyAll方法的唤醒,或等待超时后自动唤醒. wait等待其实是对象 ...
- java 并发编程——Thread 源码重新学习
Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...
- Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(五)之Controlling Execution
In Java, the keywords include if-else,while,do-while,for,return,break, and a selection statement cal ...
- 《Pro SQL Server Internals, 2nd edition》的CHAPTER 3 Statistics中的Introduction to SQL Server Statistics、Statistics and Execution Plans、Statistics Maintenance(译)
<Pro SQL Server Internals> 作者: Dmitri Korotkevitch 出版社: Apress出版年: 2016-12-29页数: 804定价: USD 59 ...
- JVM Specification 9th Edition (4) Chapter 4. The class File Format
Chapter 4. The class File Format Table of Contents 4.1. The ClassFile Structure 4.2. Names 4.2.1. Bi ...
- JVM Specification 9th Edition (4) Chapter 3. Compiling for the Java Virtual Machine
Chapter 3. Compiling for the Java Virtual Machine 内容列表 3.1. Format of Examples 3.2. Use of Constants ...
- JVM Specification 9th Edition (3) Chapter 2. The Structure of the Java Virtual Machine
Chapter 2. The Structure of the Java Virtual Machine 内容列表 2.1. The class File Format (class文件的格式) 2. ...
随机推荐
- 恶意软件/BOT/C2隐蔽上线方式研究
catalogue . 传统木马上线方式 . 新型木马上线方式 . QQ昵称上线 . QQ空间资料上线 . 第三方域名上线 . UDP/TCP二阶段混合上线 . Gmail CNC . NetBot两 ...
- Cacti /graphs_new.php SQL Injection Vulnerability
catalogue . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 other SQL injection vulnerability ...
- 深入学习 memset 函数
最近,和同学讨论了一下memset函数,趁着周五空闲做一总结. memset函数最常用的功能就是初始化数组了(主要是置零),如 #include <iostream> #include & ...
- C#实体图片下载与批量下载(自动保存功能)
新工作,第一个小任务,制作一个点击下载图片的功能.并提供批量下载操作.图片是字节流的形式,存放在数据库中的. 为了避免直接从数据库中,下载失败,会在本地保存一份. 进行压缩的是SharpZip这个压缩 ...
- 屠蛟之路_重伤的屠蛟俊_ThirdDay
在屠蛟少年们重登数据库大山的途中,少年屠蛟俊(511)实力扛把子,一直坚持在队伍前头开路引领.披荆斩棘,却也因为一路与险水恶林.狂禽猛兽做战斗而精力受损,最终一不小心坠进beta怪蛟设置的陷阱深洞里, ...
- UVA11136Hoax or what( multiset的应用)
题目链接 题意:n天,每天往一个箱子里放m个数,放完之后取最大的Max和最小的min做差,并把这两个数去掉,求n天之后的和 multiset 和 set的原理是相似的,multiset可以存多个相同的 ...
- 日志模块logging使用心得
在应用程序使用中,日志输出对应用维护人员.开发人员判断程序的问题起重要作用. 那么在python中如何定义程序的日志输出? 推荐使用日志模块logging 需求:实现日志内容输出在文件中和控制器中 i ...
- 在Nginx中部署基于IP的虚拟主机
一.虚拟主机概念 虚拟主机是在网络服务器上划分出一定的磁盘空间供用户放置站点.应用组件等,提供必要的站点功能.数据存放和传输功能.所谓虚拟主机,也叫"网站空间", 就是把一台运行在 ...
- WinForm------GridControl右键添加动态菜单
转载:http://www.devexpresscn.com/Resources/Documentation-440.html 更加好用的方法: 1.添加一个GridControl控件,PopupMe ...
- telnet连接ip
win7 telnet命令无法开启的解决方案(不是内部命令或外部命令) 出处:西西整理 作者:西西 日期:2012-12-21 14:22:06 [大 中 小] 评论: 0 | 我要发表看法 如果你想 ...