JVM规范系列开篇:为什么要读JVM规范?
许多人知道类加载机制、JVM内存模型,但他们可能不知道什么是《Java虚拟机规范》。对于Java开发来说,《Java虚拟机规范》才是最为官方、准确的一个文档,了解这个规范可以让我们更深入地理解JVM。我们平常说的JVM其实更多说的是HotSpot(HotSpot是JVM规范的一种实现),但我们常常将HotSpot与JVM等同起来。正因对于JVM规范认识的不足,所以我专门准备一个系列的文章,带着大家读一读JVM规范。
在接下来的一系列文章中,我将带着大家一个章节一个章节解读《Java虚拟机规范》。但也因为个人实力原因,无法做好详尽的讲解。所以本系列文章的写作风格是导读。导读的意思是我带着你一起读,遇到一段话,我写下自己的一些想法,与大家分享。导读的缺点就是不成体系,跟着章节走,所以读这个系列的文章不会有深入浅出的感觉。这点大家需要做好心理准备,以免失望。
有时候难免会有纰漏,请大家见谅。也欢迎有兴趣的朋友一起勘误,一起提出不同见解,共同推进JVM学习氛围。
绪论
打开《Java虚拟机规范》目录,我们可以看到规范分为下面几个部分:
- 第1章 引言
 - 第2章 Java虚拟机结构
 - 第3章 为Java虚拟机编译
 - 第4章 Class文件格式
 - 第5章 加载、链接与初始化
 - 第6章 Java虚拟机指令集
 - 第7章 操作码助记符
 
第1章 引言
从第1章的目录可以看出,其主要介绍一些历史以及Java虚拟机的基础知识,还有各章节提要,没有什么难度。略过。
第2章 Java虚拟机结构
第2章介绍了Class文件格式、数据类型、原始类型、引用类型、运行时数据区、栈帧、字节码指令等。
在这一部分中,我们比较熟悉的就是运行时数据区了。其实我们习惯性叫Java虚拟机内存模型或内存结构,但在JVM规范中是叫做运行时数据区的。此外栈帧也是非常重要的一个部分,与方法的调用有关。字节码指令则是更加深层次的知识。
此外,数据类型、原始类型、引用类型等也是基础的知识,但用得相对较少。
第3章 为Java虚拟机编译
这一章从名字可以看出,写的是如何编译Java文件的,将Java文件编译为字节码文件,最终提供给Java虚拟机使用。
我们之前提到Java虚拟机其实就是将字节码文件翻译成机器码,所以这里就是编译器把Java源码编译成字节码。但是到底如何编译呢?
- 算数运算要怎么编译?
 - 常量池如何编译?
 - 方法调用如何编译?
 - ……
 
这一章解决的就是这个问题。
第4章 Class文件格式
前面提到过JVM的输入物料是字节码文件,也就是Class文件,而不是Java文件。也就是说无论是Java语言,还是php语言,只要你能编译出字节码文件,那JVM就能够运行。
那么我们就知道这个Class文件必定是有统一格式的。而这一章节说的内容就是Class文件的格式构成。之前我们写过一个HelloWorld.java文件,将其编译成字节码文件,然后一个字节一个字节地分析其内容。要能分析字节码文件的内容,首先就得弄清楚Class文件的格式。而这一章就是讲解字节码文件格式的。
这一章节也是非常重要的。
第5章 加载、链接与初始化
Java虚拟机规范其实是递进、非常有节奏的。前面第2章讲了JVM的内存结构,之后将如何将源文件(.java)编译成字节码文件(.class)文件,之后将了字节码文件的格式。那么下一步是什么?
下一步就是把字节码文件加载到内存中运行呀!
没错,第5章说的就是这个内容。
首先是加载。《Java虚拟机规范》在这一章中说明了Java虚拟机将如何启动、如何创建、加载类。
其次是链接(包括验证、准备、解析)。首先会验证,字节码文件加载进来了,那么就必须要验证下这个字节码文件是否写对了,不然随便写一个文件就运行,岂不是乱套了。准备是给变量和对象分配内存。校验完数据格式,那么就要针对字节码内容进行解析了,就是读懂这些字节码数据到底要干嘛。这个过程包括了:类与接口解析、字段解析、普通方法解析等等。
之后是初始化。会运行一些初始化的构造方法,用于初始化数据。
最后运行完毕,Java虚拟机退出。
第6章 Java虚拟机指令集
指令集,其实就是一系列指令的集合。例如我们需要给一个局部变量赋予1这个值,即这个动作:int a = 1; 在我们看来,这很简单,但对于机器来说需要很多个动作。
所以Java虚拟机指令集就是将这些常用的动作集中起来,定义成一系列指令,方便我么能使用。
总结
《Java虚拟机规范》是最官方的标杆,弄懂它之后,你不会再为网上乱七八糟的资料烦恼,因为这里就是最标准的。但对于初学者来说,看JVM规范实在是枯燥难懂。所以如果你是初学者,看了这个系列的文章觉得很难懂,也不要气馁,因为着很正常。作者也是经过了三四年的不断理解和修正,才慢慢弄懂这些东西。
有时候写这个系列,我也经常质问自己:你自己水平还不够,如果写出一些不准确的东西,岂不是误人子弟。这个想法在我心中存在了许久,总是觉得要到达很高的水平才可以做这么一件事情。但后来我想:做一件事情,更重要的是你有多想去做,你希望创造价值的信念有多强,而不是你有多强。有些人很强,但他们却不分享了。而有些人,即使他们理解不是那么深刻,但他们乐于分享,却帮助了不少的人。
对于学习者的你们也是如此。学习JVM不是你需要对它的认识和理解有多深,而是你有多想学。来吧,和我一起一起进入JVM的海洋,一起学习吧!
JVM规范系列文章目录
- JVM规范系列开篇:为什么要读JVM规范?
 - JVM规范系列第1章:引言
 - JVM规范系列第2章:Java虚拟机结构
 - JVM规范系列第3章:为Java虚拟机编译
 - JVM规范系列第4章:Class文件格式
 - JVM规范系列第5章:加载、链接与初始化
 - JVM规范系列第6章:Java虚拟机指令集
 - JVM规范系列:总结
 
如果你还没下载《Java虚拟机规范》这本书,那么先点击这里下载再一块儿看吧。
JVM规范系列开篇:为什么要读JVM规范?的更多相关文章
- JVM基础系列开篇:为什么要学虚拟机?
		
跟许多人一样,我一开始接触 Java 虚拟机只是因为面试需要用到,所以硬着头皮看看.所以很多人对于为什么要学虚拟机这个问题,他们的答案都是:因为面试.但我经过了几年的学习和实战,我发现其实学习虚拟机并 ...
 - JVM基础系列第8讲:JVM 垃圾回收机制
		
在第 6 讲中我们说到 Java 虚拟机的内存结构,提到了这部分的规范其实是由<Java 虚拟机规范>指定的,每个 Java 虚拟机可能都有不同的实现.其实涉及到 Java 虚拟机的内存, ...
 - JVM基础系列第7讲:JVM 类加载机制
		
当 Java 虚拟机将 Java 源码编译为字节码之后,虚拟机便可以将字节码读取进内存,从而进行解析.运行等整个过程,这个过程我们叫:Java 虚拟机的类加载机制.JVM 虚拟机执行 class 字节 ...
 - JVM基础系列第14讲:JVM参数之GC日志配置
		
说到 Java 虚拟机,不得不提的就是 Java 虚拟机的 GC(Garbage Collection)日志.而对于 GC 日志,我们不仅要学会看懂,而且要学会如何设置对应的 GC 日志参数.今天就让 ...
 - JVM基础系列第13讲:JVM参数之追踪类信息
		
我们都知道 JVM 在启动的时候会去加载类信息,那么我们怎么得知他加载了哪些类,又卸载了哪些类呢?我们这一节就来介绍四个 JVM 参数,使用它们我们就可以清晰地知道 JVM 的类加载信息. 为了方便演 ...
 - JVM基础系列第11讲:JVM参数之堆栈空间配置
		
JVM 中最重要的一部分就是堆空间了,基本上大多数的线上 JVM 问题都是因为堆空间造成的 OutOfMemoryError.因此掌握 JVM 关于堆空间的参数配置对于排查线上问题非常重要. tips ...
 - JVM基础系列第9讲:JVM垃圾回收器
		
前面文章中,我们介绍了 Java 虚拟机的内存结构,Java 虚拟机的垃圾回收机制,那么这篇文章我们说说具体执行垃圾回收的垃圾回收器. 总的来说,Java 虚拟机的垃圾回收器可以分为四大类别:串行回收 ...
 - JVM规范系列第1章:引言
		
如果你还没下载<Java虚拟机规范>这本书,那么先点击这里下载再一块儿看吧. 前言 Java 虚拟机是一个抽象化的机器,整个规范中提及的 Java 虚拟机都是抽象化的概念,而不是特指 Or ...
 - JVM规范系列第2章:Java虚拟机结构
		
本规范描述的是一种抽象化的虚拟机的行为,而不是任何一种(译者注:包括 Oracle 公司自己的 HotSpot 和 JRockit 虚拟机)被广泛使用的虚拟机实现. 记住:JVM规范是一种高度抽象行为 ...
 
随机推荐
- python语言学习---4
			
第五天 1.任意个参数函数怎么敲? 只需定义一个可变参数即可:可变参数名字前要加 * ,可以传入0个或多个参数. #内部解释器原理:Python解释器会把传入的一组参数组装成一个tuple(不可变)传 ...
 - SQL Server如何查找表名或列名中包含空格的表和列
			
最近发现一个数据库中的某个表有个字段名后面包含了一个空格,这个空格引起了一些小问题,一般出现这种情况,是因为创建对象时,使用双引号或双括号的时候,由于粗心或手误多了一个空格,如下简单案例所示: USE ...
 - MyBatis笔记----SSM框架mybatis3整合springmvc spring4
			
上节 无springmvc框架 http://www.cnblogs.com/tk55/p/6661786.html 结构 jar包 web.xml 与index.jsp <?xml versi ...
 - [20180926]神奇的规避ORA-01795方法.txt
			
[20180926]神奇的规避ORA-01795方法.txt --//大家知道in里面的值限制1000个值,如果超出报ORA-01795错误. D:\> ooerr 0179501795, 00 ...
 - shell编程-语句(八)
			
if else判断语句 if语句 语法格式1: if 条件 then 语句1 语句2 ... 语句n fi 语法格式2: 常用于终端命令提示符中 if [条件]:then 语句:fi if else语 ...
 - JAVA枚举带赋值
			
/*媒体类型*/ public enum MediaType { html(0), video(1), audio(2);private final int value; MediaType(int ...
 - 高通平台如何使用QPST抓DUMP
			
一 :确认手机状态 手机系统死机白屏后,使用USB线 连接手机和计算机.打开计算机设备管理器 ,当其中与手机相关的端口只有DIAG 口 项(9006端口)时,表明手机处于DUMP 模式,可以抓DUMP ...
 - 在Django中接收文件并存储
			
首先是一个views函数的例子 def get_user_profiles(request): if request.method == 'POST': myFile = request.FILES. ...
 - 关于pycharm中使用charts无法显示图表的问题(属于个人粗心问题)
			
在练习用charts库对爬取的数据进行数据分析并图表化时遇到一个问题,无法显示图表,如下: 经过重装charts库等一顿折腾后,终于发现一个问题,看这里: def data_gen(type): le ...
 - 【English】20190308
			
hiring雇佣['haɪərɪŋ] across跨越 field sales区域销售[fild] [seɪlz] The Google Cloud team is growing and w ...