书刊介绍
《Java虚拟机精讲》内容简介
HotSpot VM是目前市面上高性能JVM的代表作之一,它采用解释器+JIT编译器的混合执行引擎,使得Java程序的执行性能从此有了质的飞跃。本书以极其精练的语句诠释了HotSpot VM的方方面面,比如:字节码的编译原理、字节码的内部组成结构、通过源码的方式剖析HotSpot VM的启动过程和初始化过程、Java虚拟机的运行时内存、垃圾收集算法、垃圾收集器(重点讲解了Serial收集器、ParNew收集器、Parallel收集器、CMS(Concurrent-Mark-Sweep)收集器和G1(Garbage-First)收集器)、类加载机制,以及HotSpot VM基于栈的架构模型和执行引擎(解释器的工作流程、JIT编译器的工作流程、分层编译策略、热点探测功能)等技术。
如果你对JVM感兴趣,并且从未接触过JVM,那么本书将会是你探索JVM世界的必备入门工具。
本书适用于任何对Java虚拟机感兴趣的Java开发人员、系统架构师、Java虚拟机爱好者。尤其是对于那些从未接触过Java虚拟机的Java开发人员,本书笔者竭尽所能用最精练和直接的语句诠释了有关Java虚拟机的方方面面,只要你熟练掌握了Java编程基础,那么阅读本书你将不会感觉到任何的吃力和枯燥乏味。
高翔龙:曾任平安科技高级架构师,负责高并发即时通讯系统“天下通”的系统架构设计、架构优化、核心功能研发等工作。目前就职于一家互联网创业公司,担任系统架构师,负责企业内部Hadoop大数据平台的推广和实施、系统性能调优、对新员工技术培训等工作,对系统架构设计、大数据、Java虚拟机等技术领域有着浓厚的兴趣和丰富的实战经验。作品目录
前言
创作此书的目的
本书所面向的读者
本书内容
参考文献
感谢
第1章:Java体系结构
1.1、认识Java
1.1.1、与生俱来的优点
1.1.2、语法结构和对象模型
1.1.3、历史版本追溯
1.2、Java重要概念
1.2.1、Java编程语言
1.2.2、字节码
1.2.3、Java
API
1.2.4、Java虚拟机
1.3、安装与配置Java运行环境
1.3.1、Windows环境下的安装与配置
1.3.2、Linux环境下的安装与配置
1.3.3、编写Java程序
1.3.4、编译与运行
1.3.5、关键字与标示符
1.4、Java技术的新特性
1.4.1、Java模块化与OSGi技术
1.4.2、语言无关性
1.4.3、使用Fork/Join框架实现多核并行
1.4.4、丰富的语法特性
1.4.5、过渡到64位虚拟机
1.5、实战:玩转OpenJDK
1.5.1、JDK与OpenJDK的关系
1.5.2、基于OpenJDK深度定制的淘宝JVM(TaobaoVM)
1.5.3、下载OpenJDK源代码
1.5.4、构建编译环境
1.5.5、执行整个OpenJDK的编译
1.5.6、执行单独HotSpot的编译
1.5.7、导致编译失败的一些疑难杂症
1.项目依赖不完整
2.项目依赖版本问题
3.Linux内核版本过高
1.5.8、使用GDB工具Debug
HotSpot
1.6、本章小结
第2章:字节码的编译原理
2.1、javac编译器简介
2.1.1、javac与Eclipse
Compiler
for
Java编译器
2.1.2、javac的使用与标准选项配置
2.1.3、编译原理
2.1.4、下载javac编译器源码
2.1.5、调用compile()方法执行编译
2.2、词法解析步骤
2.2.1、Token序列
2.2.2、源码字符集合与Token之间的对应关系
2.2.3、调用key()方法获取指定Token
2.2.4、调用nextToken()方法计算Token的获取规则
2.2.5、调用parseCompilationUnit()方法执行词法解析
2.3、语法解析步骤
2.3.1、调用qualident()方法解析package语法节点
2.3.2、调用importDeclaration()方法解析import语法树
2.3.3、调用classDeclaration()方法解析class语法树
2.4、语义解析步骤
2.5、生成字节码
2.6、实战:使用javap工具分析字节码
2.7、实战:使用GCJ编译器将Java源码直接编译为本地机器指令
2.8、本章小结
第3章:字节码文件
3.1、字节码文件的内部组成结构
3.2、符号引用
3.2.1、类或者接口的全限定名
3.2.2、简单名称
3.2.3、描述符
3.3、常量池
3.3.1、CONSTANT_Utf8_info常量项
3.3.2、CONSTANT_Integer_info常量项
3.3.3、CONSTANT_Float_info常量项
3.3.4、CONSTANT_Long_info常量项
3.3.5、CONSTANT_Double_info常量项
3.3.6、CONSTANT_Class_info常量项
3.3.7、CONSTANT_String_info常量项
3.3.8、CONSTANT_Fieldref_info常量项
3.3.9、CONSTANT_Methodref_info常量项
3.3.10、CONSTANT_InterfaceMethodref_info常量项
3.3.11、CONSTANT_NameAndType_info常量项
3.3.12、CONSTANT_MethodHandle_info常量项
3.3.13、CONSTANT_MethodType_info常量项
3.3.14、CONSTANT_InvokeDynamic_info常量项
3.4、字段表
3.5、方法表
3.6、属性表
3.6.1、Code属性
3.6.2、ConstantValue属性
3.6.3、Exceptions属性
3.6.4、LineNumberTable属性
3.6.5、SourceFile属性
3.6.6、LocalVariableTable属性
3.6.7、InnerClasses属性
3.6.8、BootstrapMethods属性
3.7、本章小结
第4章:剖析HotSpot的Launcher
4.1、HotSpot的源码目录结构
4.2、Launcher简介
4.3、跟踪Launcher的执行过程
4.3.1、使用Launcher启动JVM
4.3.2、启动函数main()
4.3.3、在主线程中执行JavaMain()函数
4.3.4、调用JNI_CreateJavaVM()函数初始化HotSpot
4.3.5、调用LoadClass()函数获取Java启动类
4.3.6、调用GetStaticMethodId()函数获取Java启动方法
4.3.7、调用CallStaticVoidMethod()函数执行Java启动方法
4.3.8、调用jni_DestroyJavaVM函数销毁HotSpot
4.4、实战:在Launcher中添加自定义函数模块
4.5、本章小结
第5章:剖析HotSpot的初始化过程
5.1、HotSpot的构成模块
5.2、Prims模块
5.2.1、JNI子模块
5.2.2、JVM子模块
5.2.3、JVMTI子模块
5.2.4、Perf子模块
5.3、Runtime模块
5.3.1、Thread子模块
5.3.2、调用create_vm()函数完成HotSpot的最终初始化
5.4、跟踪HotSpot的初始化过程
5.4.1、调用init()和init_2()函数初始化os模块
5.4.2、调用vm_init_globals()函数初始化全局数据结构
5.4.3、调用init_globals()函数初始化全局模块
5.5、本章小结
第6章:内存分配与垃圾回收
6.1、JVM的运行时内存区结构
6.2、线程共享内存区
6.2.1、Java堆区
6.2.2、方法区
6.2.3、运行时常量池
6.3、线程私有内存区
6.3.1、PC寄存器
6.3.2、Java栈
6.3.3、本地方法栈
6.4、性能监控区
6.5、自动内存管理
6.5.1、内存分配原理
6.5.2、逃逸分析与栈上分配
6.5.3、对象内存布局与OOP-Klass模型
6.5.4、GC的作用
6.5.5、垃圾标记:根搜索算法
6.5.6、垃圾回收:分代收集算法
6.6、垃圾收集器
6.6.1、串行回收:Serial收集器
6.6.2、并行回收:ParNew收集器
6.6.3、程序吞吐量优先:Parallel收集器
6.6.4、低延迟:CMS(Concurrent-Mark-Sweep)收集器
6.6.5、区域化分代式:G1(Garbage-First)收集器
6.6.6、垃圾收集的相关选项配置
6.7、实战:GC日志分析
6.7.1、不同GC日志的展示形式
1.Serial/Serial
Old收集器的日志形式:
2.ParNew收集器的日志形式:
3.Parallel/Parallel
Old收集器的日志形式:
4.CMS收集器的日志形式:
5.G1收集器的日志形式:
6.7.2、使用GCHisto工具分析离线日志
6.8、实战:分析dump文件
6.8.1、使用jmap工具生成dump文件
6.8.2、使用MAT(Memory
Analyzer
Tool)工具分析dump文件
6.9、本章小结
第7章:类加载机制
7.1、类加载器
7.1.1、抽象类ClassLoader
7.1.2、双亲委派模型
7.1.3、自定义类加载器
7.1.4、定位ClassNotFoundException异常
7.1.5、定位NoClassDefFoundError异常
7.2、类的加载过程
7.2.1、加载字节码
7.2.2、验证阶段
7.2.3、准备阶段
7.2.4、解析阶段
7.2.5、初始化阶段
7.3、实战:字节码文件的加密与解密
7.4、本章小结
第8章:剖析HotSpot的架构模型与执行引擎
8.1、栈帧的组成结构
8.1.1、局部变量表
8.1.2、操作数栈
8.1.3、动态链接
8.1.4、方法返回值
8.2、HotSpot中执行引擎的架构模型
8.2.1、本地机器指令
8.2.2、寄存器架构与栈式架构之间的区别
8.2.3、基于栈式架构的设计
8.2.4、调用call_stub()函数执行Java方法
8.2.5、栈顶缓存(Top-of-Stack
Cashing)技术
8.2.6、实战:跟踪字节码解释器的执行步骤
8.3、解释器与JIT编译器
8.3.1、查阅HotSpot的运行时执行模式
8.3.2、解释器的工作机制与构成模块
8.3.3、JIT编译器的工作机制与构成模块
8.3.4、分层编译策略
8.3.5、热点探测功能
8.4、本章小结
附录A
Java7新增语法特性
A.1、try-with-resources语句
A.2、泛型的“<>”类型推断运算符
A.3、声明二进制字面值
A.4、字面值下画线支持
A.5、switch表达式支持String类型
A.6、mutil-catch特性
A.7、NIO2.0文件系统的改变
附录B
指令助记符