这一章详细说明在一个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方法,并调用它。这个其中完成了下面几件事:

  1. Load the Class Test (调用Test的静态方法导致Test类的加载)
  2. Link Test:Verification,Preparation and Resolution(最后一步根据JVM的不同策略,可以直接解引用,也可以等到真正调用的时候再解引用。原文P311说的the only requirement的意思是,解引用过程中发生的错误 必须在 真正使用这个引用之前 抛出,即提前抛出 或者 当时再抛出 都可以。stackoverflow上关于这个问题的讨论)
  3. Initialization:执行class variable initializer and static initializer(如果Test 有super class ,那么它的super class 必须先完成初始化)
  4. 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:

  1. 给构造函数传参数
  2. 如果这个构造函数开头是显示调用同一个类中的另外一个构造函数,那么就用同样的五步递归调用。如果这个递归过程中发生错误,本过程也以同样的错误结束,否则,转到步骤5.
  3. 这个构造函数头没有显示调用另外一个同一类的构造函数。如果这个构造函数所在类不是Object,那么构造函数会显示或隐式调用父类的构造函数。同样用这个五步递归调用。如果中间发生错误,本过程以同样原因结束,否则,转到步骤4
  4. 执行instance initializers 和 instance variable initializers,执行顺序与它们在源码中从左到右一样。如果执行过程中抛出异常,那么这个过程以抛出同样结束,否则 转到步骤5
  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的更多相关文章

  1. android开发系列之多线程

    今天在这篇博客里面,我只想谈谈自己对程序开发里面避无可避的一个问题-多线程的一些看法与思考. 其实说到多线程这个名称相信只要接触过软件这个行业的人都已经耳熟能详了,但是如果被问到到底什么才是多线程呢? ...

  2. java Thread 接口学习

    对于程序员来说 Thread应该都不会陌生,具体的接口调用不是本篇的重点.Thread的基本概念及接口的使用:java多线程 下面将更多的从底层实现角度讲一下Thread. Thread的声明如下: ...

  3. Object的wait/notify/notifyAll&&Thread的sleep/yield/join/holdsLock

    一.wait/notify/notifyAll都是Object类的实例方法 1.wait方法:阻塞当前线程等待notify/notifyAll方法的唤醒,或等待超时后自动唤醒. wait等待其实是对象 ...

  4. java 并发编程——Thread 源码重新学习

    Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...

  5. 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 ...

  6. 《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 ...

  7. 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 ...

  8. 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 ...

  9. 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. ...

随机推荐

  1. poj1113 凸包

    result=对所有点凸包周长+pi*2*L WA了一次,被Pi的精度坑了 以后注意Pi尽可能搞精确一点.Pi=3.14还是不够用 Code: #include<vector> #incl ...

  2. ObjC 巧用反射和KVC实现JSON快速反序列化成对象

    1.简单的KVC介绍 KVC是一种间接访问对象属性的机制,不直接调用getter 和 setter方法,而使用valueForKey 来替代getter 方法,setValue:forKey来代替se ...

  3. Scala高阶函数示例

    object Closure { def function1(n: Int): Int = { val multiplier = (i: Int, m: Int) => i * m multip ...

  4. 企业应用系统设计分享PPT

    因今天上午需要为团队做一个分享,所以昨晚连夜写了一个<企业应用系统设计>的PPT,因为时间比较短,写的比较急.现在把PPT贴出来,做一个记录.同时也希望对大家有用. 文件我上传到了百度网盘 ...

  5. VS2012使用NUGet自动下载(还原)项目中使用的包

    一: 当签出完整项目后,在解决方案名称上点右键,选择"启用NuGet程序包还原". 二: 出现询问,当然要点是,当完成后,会发现在解决方案中,多出".nuget" ...

  6. 【Alpha】Phylab2.0: Postmortem

    设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 主要解决同学们写物理实验报告时,处理数据的困难--巨大的计算量和不规范的物理报告数据处理格式.典型 ...

  7. BZOJ1798: [Ahoi2009]Seq 维护序列seq

    传送门 写这道题是为了get一个同时传送乘法下标和加法下标的小技巧,线段树模板题.不多说. 标记名字打错无限智力-- //BZOJ 1798 //by Cydiater //2016.9.13 #in ...

  8. tcpdump抓包命令

    本文转自 : http://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html http://www.itshouce.com.cn/l ...

  9. css中关于居中的那点事儿

    css中关于居中的那点事儿 关于居中,无论是水平居中,还是垂直居中都有很多方式,下面我来介绍一些常用的. 第一部分:水平居中 1.实现行内元素的居中.方法:在行内元素外面的块元素的样式中添加:text ...

  10. 实现BPEL4WS演示:教程

    http://www.ibm.com/developerworks/cn/education/webservices/ws-bpelws/bpel_tutorial_cn.html 开始 什么是Bus ...