前言
Java是一门流行多年的高级编程语言,与其相关的就业岗位很多,但是最近几年却出现了用人单位招不到合适的人,而大量Java程序员找不到工作的尴尬局面。究其根本原因是岗位对Java开发技术的要求高,不但要会应用,而且更要懂其内部的运行原理。对于想要深入研究Java技术的从业人员来说,虚拟机是绕不开的话题。目前国内市场上还鲜见一本全面、 细致、深入剖析Java虚拟机源码的书籍,这正是本书要填补的市场空白
本书着重于Java虚拟机HotSpot的源码分析。开篇先从源码的构建开始讲解,然后逐步深入介绍HotSpot的类的加载机制、对象的二分模型和Serial垃圾收集器等相关知识。本书内容丰富,讲解循序渐进,除了翔实的源码剖析外,还结合大量图示和实例帮助读者深入理解相关知识,对于想对Java虚拟机底层技术感兴趣的开发人员有较高的参考价值。
目录
由于篇幅限制,笔记无法全部为大家展示出来,就以截图主要内容的形式让大家参考,深入剖析Java虚拟机原文档见文末
第1章 认识HotSpot VM
目前主流的Java虚拟机包括HotSpot、J9和Zing等,其中,HotSpot是目前使用范围最广 的虚拟机。本书将针对HotSpot虚拟机的实现原理进行详细介绍。
第2章 二分模型
HotSpot采用oop-Klass模型表示Java的对象和类。oop(ordinary object pointer)指普通 的对象指针,Klass表示对象的具体类型。
为何要设计一个一分为二的对象模型呢?这是因为HotSpot的设计者不想让每个对象中 都含有一个vtable(虚函数表),所以就把对象模型拆成Klass和oop。其中,oop中不含有任 何虚函数,自然就没有虚函数表,而Klass中含有虚函数表,可以进行方法的分发。
第3章 类的加载
第二章介绍了Java类在HotSpot VM中的表示,本章重点介绍类的加载过程。类的加载 就是将Class文件加载到HotSpot VM的内存中,通过Klass和ConstantPool等实例保存Class文 件中的元数据信息,以方便虚拟机运行Java方法,并执行反射等操作。
第4章 类与常量池的解析
第3章在介绍类的双亲委派机制时,多次涉及对ClassFileParser类中的parseClassFile()函 数的调用。因为类的加载不仅仅是找到类对应的Class文件,更要解析出Class文件中包含的 信息,然后将其转换为HotSpot VM的内部表示方式,这样虚拟机在运行的过程中才能方便 地操作。
第5章 字段的解析
在ClassfileParser::parseClassFile()函数中解析完常量池后,接着调用parser_fields()函数解 析字段信息。代码如下:
源代码位置:openjdk/hotspot/src/share/vm/classfile/classFileParser.cpp
u2 java_fields_count = 0;
FieldAllocationCount fac;
Array<u2>* fields = parse_fields(class_name,access_flags.is_interface(),
&fac, &java_fields_count,
CHECK_(nullHandle));
本章将详细介绍parse_fields()函数解析字段的具体实现过程。
第6章 方法的解析
在ClassfileParser::parseClassFile()函数中解析完字段后,接着会调用parser_methods()函数 解析Java中的方法。调用语句如下:
bool has_final_method = false;
AccessFlags promoted_flags;
promoted_flags.set_flags(0);
Array<Method*>* methods = parse_methods(access_flags.is_interface(),
&promoted_flags,
&has_final_method,
&has_default_methods,
CHECK_(nullHandle));
本章将详细介绍parse_methods()函数解析Java方法的过程。
第7章 类的连接与初始化
类的生命周期可以分为5个阶段,分别为加载、连接、初始化、使用和卸载,如图所 示。
类的加载过程包括加载、连接和初始化三个阶段。在第3章至第6章中已经介绍了加载阶 段,此时已经成功将Class文件中的元数据信息转换成了C++内部的表示形式。本章将详细介 绍类的连接和初始化阶段,类的连接具体包括对类的验证、准备和解释。
第8章 运行时数据区
HotSpot VM在执行Java程序的过程中,为了满足各种不同需求会将内存划分为若干个 不同的运行时数据区。主要的数据区有堆空间、栈空间和直接内存。本章将详细介绍这3个 数据区。
第9章 类对象的创建
类的生命周期可以分为5个阶段,分别为加载、连接、初始化、使用和卸载。前几章介 绍了类的加载、连接和初始化阶段,本章将介绍类对象的创建、引用和回收过程。
第10章 垃圾回收
HotSpot VM可以自动管理内存,它在内存中划出一块区域用来给Java程序分配内存, 在释放时,通过垃圾收集器回收那些不再使用的对象,有效减轻了Java应用开发人员的负 担,也避免了更多内存泄漏的风险。
本章将简单介绍HotSpot VM垃圾回收中涉及的算法与相关的垃圾收集器,不进行源代 码分析,后几章会对HotSpot VM的垃圾回收及内存管理进行详细的源代码解读。另外,本 章还会介绍安全点的相关知识,它是系统为了配合垃圾回收而做的工作,垃圾回收任务必须 在安全点下执行内存回收。
第11章 Serial垃圾收集器
Serial收集器是一个单线程的收集器,采用“复制”算法。“单线程”并不是说只使用一个CPU或一条收集线程去完成垃圾收集工作,而是指在进行垃圾收集时,必须暂停其他的工作 线程,直到收集结束。本章将详细介绍Serial垃圾回收的具体实现过程。
第12章 Serial Old垃圾收集器
Serial Old垃圾收集器虽然是老年代收集器,但是在收集老年代对象的同时也会回收年轻 代对象。Serial Old垃圾收集器所使用的垃圾回收算法是标记-压缩-清理算法。在回收阶段,
Serial Old垃圾收集器会将标记对象越过堆的空闲区移动到堆的另一端,所有被移动的对象的 引用也会被更新并指向新的位置。本章将详细介绍各种阶段的实现过程。
第13章 Java引用类型
Serial Old收集器在全部回收老年代对象的同时也会回收年轻代对象。Serial Old收集器所 使用的垃圾回收算法是标记-压缩-清理算法。在回收阶段,Serial Old将标记对象越过堆的空 闲区移动到堆的另一端,所有被移动的对象的引用也会被更新为指向新的位置。本章将详细 介绍各种阶段的实现过程。
本书主要面向想要深入学习和研究Java语言运行原理的人,尤其是正在从事或将来想要从事虚拟机开发的编程人员。另外,本书还非常适合Java求职人员阅读,可以帮助他们系统掌握虚拟机的相关知识,从而游刃有余地应对相关公司招聘时的考查。