这就是实力!京东资深架构师用实例详解Java虚拟机(源码剖析)

news2024/11/19 20:26:02

前言

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求职人员阅读,可以帮助他们系统掌握虚拟机的相关知识,从而游刃有余地应对相关公司招聘时的考查。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/653852.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

祛除红眼算法python实现

最近研究了一下祛除红眼的算法&#xff0c;主要的思想都是将RGB通道里面的R通道给想法设法的降低&#xff0c;其他的通道稍微进行变换就行&#xff0c;这里使用python运行了一下例子看看&#xff0c; version2参考了代码&#xff1a;https://www.cnblogs.com/cpuimage/p/90002…

华为IP-san实验搭建

文章目录 RedHat or CentOS系统1、获得多路径软件2、配置主机iscsi名3、配置存储映射4、主机访问存储的LUN5、安装多路径解决重复磁盘问题6、使用多路径扫盘 windows系统1、为win虚拟机提供多路径包文件2、创建存储与主机的连接3、主机使用磁盘 RedHat or CentOS系统 1、获得多…

为什么 kubernetes 环境要求开启 bridge-nf-call-iptables ?

文章目录 背景基于网桥的容器网络Service 同节点通信问题开启 bridge-nf-call-iptables我的环境netshoot 工具 参考 背景 Kubernetes 环境中&#xff0c;很多时候都要求节点内核参数开启 bridge-nf-call-iptables: sysctl -w net.bridge.bridge-nf-call-iptables1 参考官方文…

SQL语句的一些高级用法1

这里写目录标题 SQL语句的一些高级用法11.修改表名和表结构1&#xff0e;修改表名 2.扩展表结构&#xff08;增加字段&#xff09;3.修改字段&#xff08;列&#xff09;名&#xff0c;添加唯一键4&#xff0e;删除字段 案例扩展数据表高级操作1.克隆表&#xff0c;将数据表的数…

【Spring Boot学习】Spring Boot的创建和使用

前言&#xff1a; &#x1f49e;&#x1f49e;今天我们开始学习Spring Boot&#xff0c;这里我们会学习到怎么去创建和使用Spring Boot&#xff0c;在这里我们会了解到什么是最为核心的框架之一。 &#x1f49e;&#x1f49e;前路漫漫&#xff0c;希望大家坚持下去&#xff0c;…

大模型 Transformer介绍-Part1

众所周知&#xff0c;transformer 架构是自然语言处理 (NLP) 领域的一项突破。它克服了 seq-to-seq 模型&#xff08;如 RNN 等&#xff09;无法捕获文本中的长期依赖性的局限性。事实证明&#xff0c;transformer 架构是 BERT、GPT 和 T5 及其变体等革命性架构的基石。正如许多…

SpringBoot仿GPT数据流传输

目录 Java数据流传输响应前提Springboot文字流响应Web端接收流数据并显示 SpingBoot集成ChatGPT使用流响应结果 Java数据流传输响应 前提 在折腾ChatGpt集成在SpringBoot项目时&#xff0c;发现了ChatGpt api返回数据时有两种返回方式&#xff0c;一种是使用流传输&#xff0…

MyCat总结

目录 什么是mycat 核心概念 逻辑库 逻辑表 分片节点 数据库主机 用户 mycat原理 目录结构 配置文件 读写分离 搭建读写分离 搭建主从复制&#xff1a; 搭建读写分离&#xff1a; 分片技术 垂直拆分 实现分库&#xff1a; 水平拆分 实现分库&#xff1a; ER表 全局表 分…

简要介绍 | 基于深度学习的姿态估计技术

注1&#xff1a;本文系“简要介绍”系列之一&#xff0c;仅从概念上对基于深度学习的姿态估计技术进行非常简要的介绍&#xff0c;不适合用于深入和详细的了解。 注2&#xff1a;"简要介绍"系列的所有创作均使用了AIGC工具辅助 基于深度学习的姿态估计技术 背景介绍 …

【备战秋招】每日一题:2023.05-B卷-华为OD机试 - 告警抑制

2023大厂笔试模拟练习网站&#xff08;含题解&#xff09; www.codefun2000.com 最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据&#xff0c;挂载到我们的OJ上&#xff0c;供大家学习交流&#xff0c;体会笔试难度。现已录入200道互联网大厂模拟练习题&a…

基于Dlib的疲劳检测系统

需要源码的朋友可以私信我 基于Dlib的疲劳检测系统 1、设计背景及要求2、系统分析3、系统设计3.1功能结构图3.2基于EAR、MAR和HPE算法的疲劳检测3.2.1基于EAR算法的眨眼检测3.2.2基于MAR算法的哈欠检测3.3.3基于HPE算法的点头检测 4、系统实现与调试4.1初步实现4.2具体实现过程…

使用MATLAB画SCI论文图

从gcf和gca说起 不论是 Python 绘图还是Matlab绘图&#xff0c;想要获得更好看的图&#xff0c;都会用到这两个单词。 gcf&#xff1a;get current figure&#xff0c;是目标图像的图形句柄对象 gca&#xff1a;get current axes&#xff0c;是目标图像的坐标轴句柄对象 Mat…

pandas---数学函数、离散化处理、分组聚合

1. 数学函数 方差&#xff1a;当数据分布比较分散&#xff08;即数据在平均数附近波动较大&#xff09;时&#xff0c;各个数据与平均数的差的平方和 较大&#xff0c;方差就较大&#xff1b;当数据分布比较集中时&#xff0c;各个数据与平均数的差的平方和较小。因此方差越 …

【计算机网络】如何学好计网-第一章概论

相关术语 URI&#xff1a;Uniform Resource Identifier 统一资源标识符&#xff0c;指的是一个资源 URL&#xff1a;Uniform Resource Location 统一资源定位符&#xff0c;URI的子集&#xff0c;用地址定为的方式指定一个资源 URN&#xff1a;Uniform Resource Name 统一资…

北京论道|光环云李卓然:以“云”为帆 赋能文化出海行业创新增长

2023年6月15~16日&#xff0c;由流媒体网主办&#xff0c;北京新媒体&#xff08;集团&#xff09;有限公司、北京联通、北京电信、北京移动共同协办的「北京论道暨第25届中国智能视听与科技创新高峰论坛」在北京隆重举行。 本届论道以“电视的未来与未来的电视”为主题&#…

java语言中方法的重载

文章目录 前言一、重载是什么&#xff1f;二、使用步骤 1.实操展示2.注意事项总结 前言 小时候&#xff0c;我们学会了十以内的加法&#xff0c;却对十以外的加法感到害怕&#xff0c;但从现在来看&#xff0c;它们都属于加法&#xff0c;只是计算方法略有不同。方法的重载也一…

【备战秋招】每日一题:2023.05-B卷-华为OD机试 - 阿里巴巴找黄金宝箱(IV)

2023大厂笔试模拟练习网站&#xff08;含题解&#xff09; www.codefun2000.com 最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据&#xff0c;挂载到我们的OJ上&#xff0c;供大家学习交流&#xff0c;体会笔试难度。现已录入200道互联网大厂模拟练习题&a…

Computer Graphics From Scratch - Chapter 9

系列文章目录 简介&#xff1a;Computer Graphics From Scratch-《从零开始的计算机图形学》简介 第一章: Computer Graphics From Scratch - Chapter 1 介绍性概念 第二章&#xff1a;Computer Graphics From Scratch - Chapter 2 基本光线追踪 第三章&#xff1a;Computer Gr…

IEEE 最佳论文提名 | TraND:用步态算法优化身份识别

来源&#xff1a;投稿 作者&#xff1a;小灰灰 编辑&#xff1a;学姐 论文标题&#xff1a;TraND: Transferable Neighborhood Discovery for Unsupervised Cross-domain Gait Recognition 论文链接: https://arxiv.org/pdf/2102.04621v1.pdf 步态识别开始应用在公共场域身份…

centos mysql安装配置远程访问

包含以下三个部分&#xff1a;mysql安装&#xff0c;mysql密码重置、mysql配置远程访问。 一 centos安装mysql 1、wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 2、yum -y install mysql57-community-release-el7-10.noarch.rpm 3、yum…