作品简介

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 指令助记符
展开全部