具体描述
本书完整而准确地阐释了Java虚拟机各方面的细节,围绕Java虚拟机整体架构、编译器、class文件格式、加载、链接与初始化、指令集等核心主题对Java虚拟机进行全面而深入的分析,深刻揭示Java虚拟机的工作原理。同时,书中不仅完整地讲述了由Java SE 8所引入的新特性,例如对包含默认实现代码的接口方法所做的调用,还讲述了为支持类型注解及方法参数注解而对class文件格式所做的扩展,并阐明了class文件中各属性的含义,以及字节码验证的规则。
作者简介
目录信息
前 言
第1章 引言1
1.1 简史1
1.2 Java虚拟机2
1.3 各章节摘要2
1.4 说明3
1.5 反馈3
第2章 Java虚拟机结构4
2.1 class文件格式4
2.2 数据类型5
2.3 原始类型与值5
2.3.1 整数类型与整型值6
2.3.2 浮点类型、取值集合及浮点值6
2.3.3 returnAddress类型和值8
2.3.4 boolean类型8
2.4 引用类型与值9
2.5 运行时数据区9
2.5.1 pc寄存器9
2.5.2 Java虚拟机栈10
2.5.3 Java堆10
2.5.4 方法区11
2.5.5 运行时常量池11
2.5.6 本地方法栈12
2.6 栈帧12
2.6.1 局部变量表13
2.6.2 操作数栈14
2.6.3 动态链接14
2.6.4 方法调用正常完成15
2.6.5 方法调用异常完成15
2.7 对象的表示15
2.8 浮点算法15
2.8.1 Java虚拟机和IEEE 754中的浮点算法15
2.8.2 浮点模式16
2.8.3 数值集合转换17
2.9 特殊方法18
2.10 异常19
2.11 字节码指令集简介20
2.11.1 数据类型与Java虚拟机21
2.11.2 加载和存储指令23
2.11.3 算术指令24
2.11.4 类型转换指令25
2.11.5 对象的创建与操作27
2.11.6 操作数栈管理指令27
2.11.7 控制转移指令27
2.11.8 方法调用和返回指令28
2.11.9 抛出异常28
2.11.10 同步28
2.12 类库29
2.13 公有设计、私有实现30
第3章 Java虚拟机编译器31
3.1 示例的格式说明31
3.2 常量、局部变量和控制结构的使用32
3.3 算术运算36
3.4 访问运行时常量池36
3.5 与控制结构有关的更多示例37
3.6 接收参数40
3.7 方法调用41
3.8 使用类实例43
3.9 数组44
3.10 编译switch语句46
3.11 使用操作数栈48
3.12 抛出异常和处理异常48
3.13 编译finally语句块51
3.14 同步54
3.15 注解55
第4章 class文件格式56
4.1 ClassFile结构57
4.2 各种名称的内部表示形式61
4.2.1 类和接口的二进制名称61
4.2.2 非限定名61
4.3 描述符62
4.3.1 语法符号62
4.3.2 字段描述符62
4.3.3 方法描述符63
4.4 常量池64
4.4.1 CONSTANT_Class_info结构65
4.4.2 CONSTANT_Fieldref_info、CONSTANT_Methodref_info和CONSTANT_InterfaceMethodref_info结构66
4.4.3 CONSTANT_String_info结构67
4.4.4 CONSTANT_Integer_info和CONSTANT_Float_info结构67
4.4.5 CONSTANT_Long_info和CONSTANT_Double_info结构68
4.4.6 CONSTANT_NameAnd-Type_info结构69
4.4.7 CONSTANT_Utf8_info结构70
4.4.8 CONSTANT_MethodHandle_info结构72
4.4.9 CONSTANT_MethodType_info结构73
4.4.10 CONSTANT_Invoke-Dynamic_info结构74
4.5 字段74
4.6 方法76
4.7 属性78
4.7.1 自定义和命名新的属性82
4.7.2 ConstantValue属性82
4.7.3 Code属性83
4.7.4 StackMapTable属性86
4.7.5 Exceptions属性92
4.7.6 InnerClasses属性93
4.7.7 EnclosingMethod属性95
4.7.8 Synthetic属性96
4.7.9 Signature属性96
4.7.10 SourceFile属性100
4.7.11 SourceDebugExtension属性101
4.7.12 LineNumberTable属性102
4.7.13 LocalVariableTable属性103
4.7.14 LocalVariableTypeTable属性104
4.7.15 Deprecated属性106
4.7.16 RuntimeVisibleAnnota-tions属性106
4.7.17 RuntimeInvisible-Annotations属性110
4.7.18 RuntimeVisibleParameterAnnotations属性111
4.7.19 RuntimeInvisiblePara-meterAnnotations属性112
4.7.20 RuntimeVisibleTypeAnnotations属性114
4.7.21 RuntimeInvisibleType-Annotations属性124
4.7.22 AnnotationDefault属性125
4.7.23 BootstrapMethods属性126
4.7.24 MethodParameters属性127
4.8 格式检查129
4.9 Java虚拟机代码约束129
4.9.1 静态约束130
4.9.2 结构化约束132
4.10 class文件校验135
4.10.1 类型检查验证136
4.10.2 类型推导验证200
4.11 Java虚拟机限制206
第5章 加载、链接与初始化208
5.1 运行时常量池208
5.2 虚拟机启动210
5.3 创建和加载211
5.3.1 使用引导类加载器来加载类型212
5.3.2 使用用户自定义类加载器来加载类型212
5.3.3 创建数组类213
5.3.4 加载限制214
5.3.5 从class文件表示得到类214
5.4 链接215
5.4.1 验证216
5.4.2 准备216
5.4.3 解析217
5.4.4 访问控制225
5.4.5 方法覆盖225
5.5 初始化226
5.6 绑定本地方法实现228
5.7 Java虚拟机退出228
第6章 Java虚拟机指令集229
6.1 设定:“必须”的含义229
6.2 保留操作码229
6.3 虚拟机错误230
6.4 指令描述格式230
6.5 指令集描述232
第7章 操作码助记符320
附录A Limited License Grant327
· · · · · · (收起)
读后感
1. 边敲边实践,本人用的sublime编辑器再加上javap插件,屏幕开两栏,左边java代码,右边bytecode,对照着看挺好 2.在线文档,可结合着看,地址: http://www.weblearn.hs-bremen.de/risse/RST/docs/JavaVM/vmspec.pdf 3. 以前看过《自制编程语言》其中有门语言就类似java,作...
1. 边敲边实践,本人用的sublime编辑器再加上javap插件,屏幕开两栏,左边java代码,右边bytecode,对照着看挺好 2.在线文档,可结合着看,地址: http://www.weblearn.hs-bremen.de/risse/RST/docs/JavaVM/vmspec.pdf 3. 以前看过《自制编程语言》其中有门语言就类似java,作...
1. 边敲边实践,本人用的sublime编辑器再加上javap插件,屏幕开两栏,左边java代码,右边bytecode,对照着看挺好 2.在线文档,可结合着看,地址: http://www.weblearn.hs-bremen.de/risse/RST/docs/JavaVM/vmspec.pdf 3. 以前看过《自制编程语言》其中有门语言就类似java,作...
规范性的东西,不同的JVM厂商有不同的JVM实现。很多东西,JVM规范并没有强制要求,具体还是要看JVM实现。这本书写的还是不错,但是不容忽视的一点是,看着看着,你一定会睡着。你真的会睡着的。 这本书的封面不错,看起来比较有感觉。
1. 边敲边实践,本人用的sublime编辑器再加上javap插件,屏幕开两栏,左边java代码,右边bytecode,对照着看挺好 2.在线文档,可结合着看,地址: http://www.weblearn.hs-bremen.de/risse/RST/docs/JavaVM/vmspec.pdf 3. 以前看过《自制编程语言》其中有门语言就类似java,作...
用户评价
坦白说,这本书的阅读体验更像是进行一场艰苦的学术研究,而非享受一次知识的汲取过程。我发现自己很少能连续阅读超过一个小时而不感到思维疲劳。它要求读者具备扎实的计算机底层原理知识,包括操作系统、编译原理和硬件基础,否则,书中许多关于栈帧结构、局部变量表、异常处理表等概念的描述,都会如同空中楼阁般难以建立稳定的认知模型。我曾尝试在午休时间快速翻阅,结果发现这根本行不通,每一次回顾都必须从头梳理前置知识点,否则逻辑链条极易断裂。这本书的价值在于其深度和绝对的准确性,但它的“门槛”也高得吓人。它更适合那些立志于深入理解JVM底层机制的专家、编译器开发者,或者那些需要撰写兼容性测试工具的工程师。对于我这样的日常应用开发者而言,它更像是一座需要偶尔仰望、偶尔去拜访的知识圣殿,而非可以常驻其中的思想家园。
这本书的排版和用词风格,透露出一种不容置疑的权威感。它没有使用任何煽情的语言或者鼓励性的口吻,完全是陈述性的、精确到位的陈述。我感觉自己像是在解读一份由古老工匠写下的、关于完美机器制造的秘籍。当我尝试理解关于操作符的精确语义,特别是那些在并发编程中容易引发歧义的地方时,这本书展现出了它最宝贵的一面——它给出了一个**标准答案**。不同于市面上那些流行的技术书籍,它们会根据自身理解做出取舍或简化,这本书则拒绝妥协,直接将语言规范的全部重量压在了读者身上。这让我有些疲惫,但同时也感到安心,因为我知道,如果未来在Java语言特性上发生任何争论,这本书提供的定义将是最终的仲裁者。然而,这种极致的严谨性也带来了阅读上的障碍,我常常需要借助其他资料来“软化”这些尖锐的规范描述,才能将其转化为可操作的知识。
我尝试着将这本书带到工作现场,希望能解决几个困扰我已久的性能调优难题。说实话,最初的几章确实提供了理论基础,比如类加载机制的层次划分,那部分内容清晰且逻辑严密,让我对类文件的生命周期有了更深刻的认识。但当我试图深入到字节码指令集及其与底层CPU架构的交互时,阅读体验直线下降。那些对StackMapTable、RuntimeConstantPool等结构的精确描述,虽然在技术上无可指摘,但对于我这种更偏向于“用”而不是“造”的开发者来说,显得过于细节和冷峻。我更期望看到的是,某个特定规范是如何影响主流JVM(比如HotSpot)的具体实现,以及在不同场景下,这些规范的微小差异会如何导致实际运行结果的巨大偏差。这本书更像是一部哲学著作,探讨的是“应该是什么样”,而非“实际上是怎么样”,这使得它在解决我那些迫切的、与现有系统打交道的实际问题时,显得有些力不从心,需要我进行大量的二次翻译和推导。
这本书厚重得让我有些不知所措,书页散发着油墨特有的味道,那种感觉就像是走进了一家老旧但藏书丰富的图书馆。初次翻开,我立刻被那密密麻麻的符号、复杂的结构图和晦涩的术语淹没了。它绝不是一本用来放松阅读的休闲读物,更像是一份需要极其专注才能啃下来的技术手册。我本来以为自己对Java生态系统已经有了不错的理解,至少在应用层面上是游刃有余的,但这本书的存在,让我猛然意识到自己所站立的基础是多么的浅薄。我记得翻到关于内存模型的章节时,不得不停下来,反复对比图示和文字描述,试图理解那些关于“happens-before”关系的微妙之处。那种感觉就像是,你一直以为你知道一栋房子的布局,直到有人递给你这份极其详尽、连每一根电线走向都标注清楚的建筑蓝图,你才发现自己之前只是在表面上“住”过。我花了大量的时间去查阅上下文,试图将书中的理论与实际的JVM运行日志联系起来,然而,这本书本身更侧重于规范的定义,而非手把手的实操指导,这无疑增加了入门的难度,但同时也预示着其作为权威参考的价值。
作为一本聚焦于特定Java版本的规范性著作,其时效性是一个绕不开的话题。我阅读的这个版本对应的是Java SE 8,虽然它确立了Lambda表达式和Stream API的基石,为现代Java编程奠定了坚实的基础,但当我们身处技术快速迭代的前沿时,总会不自觉地将书中的内容与当前最新的JDK特性进行对比。例如,在阅读到关于对象头或锁机制的描述时,我禁不住会想,如果涉及到Project Loom或者Valhalla项目带来的根本性变革,这本书中的某些论述是否会显得有些过时或不完整?这种“时代感”并非指其内容错误,而是指它更像是一份定格在某个历史时刻的完美快照。它详细记录了那个时间点的“契约”,但对于展望未来,或者理解那些尚未完全固化的演进方向,它提供的指引就相对有限了,读者必须自行去弥补这部分知识的空白。
字节码方面完备的参考书,2、3章细读,4、5、6章查阅。
只适合了解Java虚拟机的人读
看的是oracle官网se12 pdf
只适合了解Java虚拟机的人读
字节码方面完备的参考书,2、3章细读,4、5、6章查阅。