我们花了几天的时间来阅读《Java虚拟机规范》,了解要实现一个虚拟机应该包括什么内容。通过这么一次阅读,我们大致了解了虚拟机规范的内容。

  • 第1章。对Java虚拟机进行了一些简单的介绍。
  • 第2章。介绍了虚拟机的结构,以及一些异常体系以及字节码指令集。可以说是规范的重点内容。
  • 第3章。介绍了编译器是如何将Java源代码编译成JVM所需要的字节码的,如何去阅读这些字节码指令。
  • 第4章。这一章针对字节码文件的格式做了详细的讲解,让我们了解字节码里的每一个字节的作用。
  • 第5章。这一章对JVM是如何启动、加载以及初始化字节码做了详细的描述。
  • 第6章。这一章节介绍了虚拟机指令集的相关知识,对虚拟机指令集的每个指令做了详细的介绍,可以当成工具书来查询使用。

通过这么一个介绍,我们可以知道第2、3、4、5章节是重点。这些章节中的Java虚拟机结构、字节码文件格式、JVM加载过程是重点,读完之后至少要弄懂这些过程。

读完这份规范,也有许多不懂的地方,例如:

  • 第3章中,将Java代码编译成字节码指令集,几乎每一章节都有对应的Java代码和字节码的对照。这需要我们耐心地一个个指令去查询和理解,这部分我在阅读的时候也是简单略过。这是后期的学习重点。
  • 本文其他部分也有不少关乎数学的严谨描述,这部分我也只是粗略扫过。这也是后期进一步学习需要加强的。

简单地说,通过阅读《Java虚拟机规范》,我从官方渠道验证了之前的一些猜想。例如:

  • JVM 就是一个虚拟机的机器,与正常的PC一样,其有内存也有指令集。
  • 准备阶段,虚拟机不执行任何字节码指令,而知识为类或接口的静态字段分配空间,并用默认值初始化这些字段。
  • boolean类型在JVM中的实现,是通过int类型来实现的。在JVM中,是没有boolean类型这一数据类型的。
  • 等等

很多时候我们会被网络上许多知识点的解释迷惑,不知道哪个说的是正确的。这个时候就需要我们去找到官方的消息渠道。而对于虚拟机来说,《Java虚拟机规范》就是这样一个官方的消息,在规范中所说的就是绝对正确的消息来源。所以说阅读《Java虚拟机规范》才显得尤为重要。

通过这一次阅读,我验证了不少之前留存下来的疑惑,也新增了不少新的疑惑。但我相信这一次阅读将会给我带来很大的积极影响,下次当我遇到虚拟机模棱两可的问题时,我会优先查找规范中的解释,之后再去参考其他的。这可以说是一种更为有效的学习方式。

如果你还没有阅读过,那么你可以跟着这个系列,与我一起阅读。也与我一样,在阅读中写下自己的想法。随着更多人能读完这本规范,我相信也有更多不同的想法蹦出,通过彼此交流,我们定能够理解得更加深刻。

JVM规范系列文章目录

JVM规范系列:总结的更多相关文章

  1. JVM规范系列开篇:为什么要读JVM规范?

    许多人知道类加载机制.JVM内存模型,但他们可能不知道什么是<Java虚拟机规范>.对于Java开发来说,<Java虚拟机规范>才是最为官方.准确的一个文档,了解这个规范可以让 ...

  2. JVM规范系列第1章:引言

    如果你还没下载<Java虚拟机规范>这本书,那么先点击这里下载再一块儿看吧. 前言 Java 虚拟机是一个抽象化的机器,整个规范中提及的 Java 虚拟机都是抽象化的概念,而不是特指 Or ...

  3. JVM规范系列第2章:Java虚拟机结构

    本规范描述的是一种抽象化的虚拟机的行为,而不是任何一种(译者注:包括 Oracle 公司自己的 HotSpot 和 JRockit 虚拟机)被广泛使用的虚拟机实现. 记住:JVM规范是一种高度抽象行为 ...

  4. JVM规范系列第3章:为Java虚拟机编译

    Oracle 的 JDK 包括两部分内容:一部分是将 Java 源代码编译成 Java 虚拟机的指令集的编译器,另一部分是用于Java 虚拟机的运行时环境. 第一部分应该说的是 Javac 这个前置编 ...

  5. JVM规范系列第4章:Class文件格式

    这一章节讲的是字节码的整个组成格式,读懂了这一章,就读懂了字节码文件.对于这一章的学习,我更推荐作为工具书去查找.最好是找一个最简单的Hello World例子,一个字节一个字节去分析其含义.在分析过 ...

  6. JVM规范系列第5章:加载、链接与初始化

    加载是根据特定名称查找类或接口类型的二进制表示(Binary Representation),并由此二进制表示创建类或接口的过程. 加载,就是指去寻找类或接口的过程. 链接是为了让类或接口可以被 Ja ...

  7. JVM规范系列第6章:Java虚拟机指令集

    一条 Java 虚拟机指令由一个特定操作的操作码和零至多个操作所使用到的操作数所构成. 虚拟机指令 = 操作码 + 操作数. 其中,操作码值分别为 254(0xfe)和 255(0xff),助记符分别 ...

  8. JVM基础系列第8讲:JVM 垃圾回收机制

    在第 6 讲中我们说到 Java 虚拟机的内存结构,提到了这部分的规范其实是由<Java 虚拟机规范>指定的,每个 Java 虚拟机可能都有不同的实现.其实涉及到 Java 虚拟机的内存, ...

  9. JVM基础系列第7讲:JVM 类加载机制

    当 Java 虚拟机将 Java 源码编译为字节码之后,虚拟机便可以将字节码读取进内存,从而进行解析.运行等整个过程,这个过程我们叫:Java 虚拟机的类加载机制.JVM 虚拟机执行 class 字节 ...

随机推荐

  1. iframe在iphone中滚动条无效

    在iphone(ios11)中(其他苹果设备未尝试),不论是在微信的浏览器中,还是在其他浏览器中,iframe的滚动条怎么设置都没有效果,页面内容都无法进行滚动; 解决方法: 将iframe包裹在di ...

  2. SqlServer索引页损坏恢复

    问题背景 运维操作失误,在没有正常关闭sqlserver的情况下,将服务器关闭了,重启后某些表损坏(应该是某些页损坏了,没有损坏的页还能访问到数据,但是访问损坏了的页就有问题),目前数据库只有4.20 ...

  3. Linux进程ID号--Linux进程的管理与调度(三)【转】

    Linux 内核使用 task_struct 数据结构来关联所有与进程有关的数据和结构,Linux 内核所有涉及到进程和程序的所有算法都是围绕该数据结构建立的,是内核中最重要的数据结构之一. 该数据结 ...

  4. CentOS7搭建OpenVPN

    目录 CentOS7搭建OpenVPN 环境 安装 第一步.安装openvpn及所需软件 第二步.编辑vars文件,根据自己环境配置 第三步.创建服务端证书及key 第四步.创建客户端证书 第五步.拷 ...

  5. Windows端部署zabbix-agent

    一.windows客户端的配置关闭windows防火墙或者开通10050和10051端口(1).关闭防火墙(不推荐直接关闭,测试可以这样做,尤其是最近勒索病毒猛烈)开始—控制面板—windows防火墙 ...

  6. c++11の多线程应用

    std::thread 应用十分方便,通过#include<thread>引入 std::thread t(subFunction); t.join(); 主线程将等待子线程完成后,继续调 ...

  7. Linux驱动的两种载入方式过程分析

    一.概念简述 在Linux下能够通过两种方式载入驱动程序:静态载入和动态载入. 静态载入就是把驱动程序直接编译进内核.系统启动后能够直接调用.静态载入的缺点是调试起来比較麻烦,每次改动一个地方都要又一 ...

  8. reorder-list 单链表

    题意: 给你一个单链表 a1 a2 a3 a4 a5....an 让你变成 a1 an a2 an-1 a3 an-2 .... 这里牵涉到,单链表的倒置和两个单链表的合并. class Soluti ...

  9. k8s部署rocketmq 双主

    由于apache 官网的 docker image 是单点,要实现集群方式部署. rocketmq 分为 nameserver 和 broker , 对于之间调用频繁的服务,会增加网络压力, 所以 考 ...

  10. [ASP.NET]ScriptManager控件使用

    目录 概述 局部刷新 错误处理 类型系统扩展 注册定制脚本 注册 Web 服务 在客户端脚本中使用认证和个性化服务 ScriptManagerProxy 类 添加 ScriptManager 控件 客 ...