太强了!京东资深架构师用实例详解 Java 虚拟机(源码剖析)

前言

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.cppu2 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 求职人员阅读,可以帮助他们系统掌握虚拟机的相关知识,从而游刃有余地应对相关公司招聘时的考查。对完整版感兴趣的小伙伴可以看下方

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值