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

许多人知道类加载机制.JVM内存模型,但他们可能不知道什么是<Java虚拟机规范>.对于Java开发来说,<Java虚拟机规范>才是最为官方.准确的一个文档,了解这个规范可以让我们更深入地理解JVM.我们平常说的JVM其实更多说的是HotSpot(HotSpot是JVM规范的一种实现),但我们常常将HotSpot与JVM等同起来.正因对于JVM规范认识的不足,所以我专门准备一个系列的文章,带着大家读一读JVM规范. 在接下来的一系列文章中,我将带着大家一个章节一个章节解读<J…
如果你还没下载<Java虚拟机规范>这本书,那么先点击这里下载再一块儿看吧. 前言 Java 虚拟机是一个抽象化的机器,整个规范中提及的 Java 虚拟机都是抽象化的概念,而不是特指 Oracle 或者其他某一间公司的 Java 虚拟机实现. 可以看到JVM其实就是一个虚拟机的机器,与我们的普通PC一样,有内存.有CPU.JVM的内存就是运行时数据区,其CPU就是Java虚拟机指令集. 另外,我们还修正了许多<Java 虚拟机规范(第一版)> 和<Java 语言规范>…
本规范描述的是一种抽象化的虚拟机的行为,而不是任何一种(译者注:包括 Oracle 公司自己的 HotSpot 和 JRockit 虚拟机)被广泛使用的虚拟机实现. 记住:JVM规范是一种高度抽象行为的描述,而不是具体虚拟机的实现. 所有在虚拟机规范之中没有明确描述的实现细节,都不应成为虚拟机设计者发挥创造性的牵绊,设计者可以完全自主决定所有规范中不曾描述的虚拟机内部细节,例如:运行时数据区的内存如何布局.选用哪种垃圾收集的算法.是否要对虚拟机字节码指令进行一些内部优化操作(如使用即时编译器把字…
Oracle 的 JDK 包括两部分内容:一部分是将 Java 源代码编译成 Java 虚拟机的指令集的编译器,另一部分是用于Java 虚拟机的运行时环境. 第一部分应该说的是 Javac 这个前置编译器,用于将Java源代码编译成字节码.第二部分是说 JIT 即时编译器,用于在JVM运行时进行进一步优化,将字节码编译成本地机器码. 即时代码生成器(Just-In-Time/JIT Code Generator)就是一种在 Class 文件中的代码被 Java 虚拟机代码加载后,生成与平台相关的…
这一章节讲的是字节码的整个组成格式,读懂了这一章,就读懂了字节码文件.对于这一章的学习,我更推荐作为工具书去查找.最好是找一个最简单的Hello World例子,一个字节一个字节去分析其含义.在分析过程中,把这个章节当成工具来查询每个字节的含义. 我写了一篇文章来带你一个字节一个字节分析,有兴趣的可以看:JVM系列第5讲:字节码文件结构 Java 虚拟机实现会在文件的链接阶段(§ 5.4)对 Class 文件进行必要的校验. 看到这里,知道JVM会在文件的链接阶段,做JDK版本的校验. 这个章节…
加载是根据特定名称查找类或接口类型的二进制表示(Binary Representation),并由此二进制表示创建类或接口的过程. 加载,就是指去寻找类或接口的过程. 链接是为了让类或接口可以被 Java 虚拟机执行,而将类或接口并入虚拟机运行时状态的过程. 链接,就是将类或接口与JVM链接起来的过程. 类或接口的初始化是指执行类或接口的初始化方法(§ 2.9) 初始化,就是执行方法的过程. Java 虚拟机为每个类型都维护一个常量池. 这里注意关键词「每个类型」,也就是说整型是一个常量池,字符…
一条 Java 虚拟机指令由一个特定操作的操作码和零至多个操作所使用到的操作数所构成. 虚拟机指令 = 操作码 + 操作数. 其中,操作码值分别为 254(0xfe)和 255(0xff),助记符分别为 impdep1 和 impdep2的两个操作码是作为"后门"和"陷阱"出现,目的是在某些硬件和软件中提供一些与实现相关的功能.第三个操作码值分别为 202(0xca).助记符为 breakpoint 的操作码是用于调试器实现断点功能. 三个保留操作码: 254(0x…
我们花了几天的时间来阅读<Java虚拟机规范>,了解要实现一个虚拟机应该包括什么内容.通过这么一次阅读,我们大致了解了虚拟机规范的内容. 第1章.对Java虚拟机进行了一些简单的介绍. 第2章.介绍了虚拟机的结构,以及一些异常体系以及字节码指令集.可以说是规范的重点内容. 第3章.介绍了编译器是如何将Java源代码编译成JVM所需要的字节码的,如何去阅读这些字节码指令. 第4章.这一章针对字节码文件的格式做了详细的讲解,让我们了解字节码里的每一个字节的作用. 第5章.这一章对JVM是如何启动.…
在第 6 讲中我们说到 Java 虚拟机的内存结构,提到了这部分的规范其实是由<Java 虚拟机规范>指定的,每个 Java 虚拟机可能都有不同的实现.其实涉及到 Java 虚拟机的内存,就不得不谈到 Java 虚拟机的垃圾回收机制.因为内存总是有限的,我们需要一个机制来不断地回收废弃的内存,从而实现内存的循环利用,这样程序才能正常地运转下去. 比起 Java 虚拟机的内存结构有<Java 虚拟机规范>规定,垃圾回收机制并没有具体的规范约束.所以很多时候不同的虚拟机有不同的实现方式…
当 Java 虚拟机将 Java 源码编译为字节码之后,虚拟机便可以将字节码读取进内存,从而进行解析.运行等整个过程,这个过程我们叫:Java 虚拟机的类加载机制.JVM 虚拟机执行 class 字节码的过程可以分为七个阶段:加载.验证.准备.解析.初始化.使用.卸载. 在开始聊之前,先给大家看一道面试题. class Grandpa { static { System.out.println("爷爷在静态代码块"); } } class Father extends Grandpa…
看到这里,我相信大家对于一个 Java 源文件是如何变成字节码文件,以及字节码文件的含义已经非常清楚了.那么接下来就是让 Java 虚拟机运行字节码文件,从而得出我们最终想要的结果了.在这个过程中,Java 虚拟机会加载字节码文件,将其存入 Java 虚拟机的内存空间中,之后进行一系列的初始化动作,最后运行程序得出结果. 那么字节码数据在 Java 虚拟机内存中是如何存放的 ?Java 虚拟机在为类实例或成员变量分配内存是如何分配的 ?要解答上面这些问题,我们首先需要了解一下 Java 虚拟机的…
温馨提示:此篇文章长达两万字,图片50多张,内容非常多,建议收藏后再看. 前面我们说到 Java 虚拟机使用字节码实现了跨平台的愿景,无论什么系统,我们都可以使用 Java 虚拟机解释执行字节码文件.但其实字节码是有一套规范的,而规定字节码格式的就是<Java 虚拟机规范>.<Java 虚拟机规范>规定了 Java 虚拟机结构.Class 类文件结构.字节码指令等内容.其中类文件结构是有必要了解的一个内容. 字节码文件结构是一组以 8 位字节为基础的二进制流,各数据项目严格按照顺序…
在上篇文章我们聊到,无论什么语言写的代码,其到最后都是通过机器码运行的,无一例外.那么对于 Java 语言来说,其从源代码到机器码,这中间到底发生了什么呢?这就是今天我们要聊的. 如下图所示,编译器可以分为:前端编译器.JIT 编译器和AOT编译器.下面我们逐个讲解. 前端编译器:源代码到字节码 之前我们说到:对于 Java 虚拟机来说,其实际输入的是字节码文件,而不是 Java 文件.那么对于 Java 语言而言,其实怎么将 Java 代码转化成字节码文件的呢?我们知道在 JDK 的安装目录里…
我们都知道在 Windows 系统上一个软件包装包是 exe 后缀的,而这个软件包在苹果的 Mac OSX 系统上是无法安装的.类似地,Mac OSX 系统上软件安装包则是 dmg 后缀,同样无法在 Windows 系统上安装. 为什么不同系统上的软件无法安装,这是因为操作系统底层的实现是不一样的.对于 Windows 系统来说,exe 后缀的软件代码最终编译成 Windows 系统能识别的机器码.而 Mac OSX 系统来说,dmg 后缀的软件代码最终编译成 Mac OSX 系统能识别的代码.…
从0实现JVM语言之语义分析-Semantic 源码github, 如果这个系列文章对您有帮助, 希望获得您的一个star 本节相关语义分析package地址 致亲爱的读者: 个人的文字组织和写文章的功底属实一般, 写的也比较赶时间, 所以系列文章的文字可能比较粗糙, 难免有词不达意或者写的很迷惑抽象的地方 如果您看了有疑问或者觉得我写的实在乱七八糟, 这个很抱歉, 确实是我的问题, 您如果有不懂的地方 的地方或者发现我的错误(文字错误, 逻辑错误或者知识点错误都有可能), 可以直接留言, 我看…
00.一个JVM语言的诞生 由于方才才获悉博客园文章默认不放在首页的, 原创文章主要通过随笔显示, 所以将文章迁移到随笔; 这篇帖子将后续更新, 欢迎关注! 这段时间要忙着春招实习, 所以项目更新会慢一点, 语言组织也会比较随意, 毕竟时间有限, 没办法太过雕琢琢磨了. 源码github仓库, 如果这个系列对您有帮助, 请您给我一个小小的star! 本节提纲 写在前面 文章目录 先修技能/工具 Cva文法-grammar推导式 说明 Cva程序样例 写在前面 从屏幕前的你搜索到这篇博文开始, 我…
JVM规范组成: 1. 字节码(ByteCode): 以Class或Interface为基本单位, 具有固定结构. 2. 指令集(InstructionSet): 每个指令用一个字节表示, 最多256条指令, 除却永久留用的指令. 3. 虚拟机(VirtualMachine): 根据字节码, 调用指令集, 管理中间结果.三者之间的关系:…
http://chenzhou123520.iteye.com/blog/1627618 上一篇介绍了<编码规范系列(一):Eclipse Code Templates设置>,这篇主要介绍Eclipse中Checkstyle的配置.关于Checkstyle,引用百度百科的介绍如下:CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发人员遵守某些编码规范的工具.它能够自动化代码规范检查过程,从而使得开发人员从这项重要,但是枯燥的任务中解脱出来.CheckStyle…
查看虚拟机进程:jps 命令 jps 命令可以列出所有的 Java 进程.如果 jps 不加任何参数,可以列出 Java 程序的进程 ID 以及 Main 函数短名称,如下所示. $ jps 6540 Jps 64447 Main 除此之外,还可以指定下面的参数自定义输出信息: 参数 含义 -q 指定jps只输出进程ID -m 输出传递给Java进程的参数 -l 输出主函数的完整路径 -v 显示传递给Java虚拟机的参数 虚拟机统计信息:jstat 命令 jstat 用于观察 Java 堆信息的…
说到 Java 虚拟机,不得不提的就是 Java 虚拟机的 GC(Garbage Collection)日志.而对于 GC 日志,我们不仅要学会看懂,而且要学会如何设置对应的 GC 日志参数.今天就让我们来学习一下 Java 虚拟机中所有与 GC 日志有关的参数.相信掌握了这些参数之后,对于大家线上打印 GC 日志是有不少帮助的. 为了能够更直观地显示出每个参数的作用,我们将以下面的 Demo 为例子去设置 GC 日志参数. /** * @author 陈树义 * @date 2018.09.2…
我们都知道 JVM 在启动的时候会去加载类信息,那么我们怎么得知他加载了哪些类,又卸载了哪些类呢?我们这一节就来介绍四个 JVM 参数,使用它们我们就可以清晰地知道 JVM 的类加载信息. 为了方便演示,我们使用下面的程序作为本次的演示程序. /** * @author chenshuyi * @date 2018.09.30 */ public class ClassLoadDemo { public static void main(String[] args) { String name…
JVM 中最重要的一部分就是堆空间了,基本上大多数的线上 JVM 问题都是因为堆空间造成的 OutOfMemoryError.因此掌握 JVM 关于堆空间的参数配置对于排查线上问题非常重要. tips:本文所有配置,如无特别说明,均基于JDK1.8. 堆配置 我们使用 -Xms 设置堆的初始空间大小,使用 -Xmx 设置堆的最大空间大小. java -Xms20m -Xmx30m GCDemo 在上面的命令中,我们设置 JVM 的初始堆大小为 20M,最大堆空间为 30M. 年轻代 在 JDK1…
我们经常会听到许多垃圾回收的术语,例如:Minor GC.Major GC.Young GC.Old GC.Full GC.Stop-The-World 等.但这些 GC 术语到底指的是什么,它们之间的区别到底是什么?今天我们就来详细说说. Minor GC 从年轻代空间回收内存被称为 Minor GC,有时候也称之为 Young GC.对于 Minor GC,你需要知道的一些点: 当 JVM 无法为一个新的对象分配空间时会触发 Minor GC,比如当 Eden 区满了.所以 Eden 区越小…
前面文章中,我们介绍了 Java 虚拟机的内存结构,Java 虚拟机的垃圾回收机制,那么这篇文章我们说说具体执行垃圾回收的垃圾回收器. 总的来说,Java 虚拟机的垃圾回收器可以分为四大类别:串行回收器.并行回收器.CMS 回收器.G1 回收器. 串行回收器 串行回收器是指使用单线程进行垃圾回收的回收器.因为每次回收时只有一个线程,因此串行回收器在并发能力较弱的计算机上,其专注性和独占性的特点往往能让其有更好的性能表现. 串行回收器可以在新生代和老年代使用,根据作用于不同的堆空间,分为新生代串行…
说起 Java 虚拟机,许多人就会将其与 HotSpot 虚拟机等同看待.但实际上 Java 虚拟机除了 HotSpot 之外,还有 Sun Classic VM.Exact VM.BEA JRocketit.IBM J9 等等.今天我们就来简单回顾下 Java 虚拟机的发展历史. 虚拟机始祖:Sun Classic 在 1996 年 1 月 23 日,Sun 发布 JDK 1.0,其中自带的虚拟机就是 Classic VM.但这款虚拟机有个特点,即只能使用纯解释器的方式来执行 Java 代码,…
Java 语言是一门存在了 20 多年的语言,其年纪比我自己还大.虽然存在了这么长时间,但 Java 至今都是最大的工业级语言,许多大型互联网公司均采用 Java 来实现其业务系统.大到国际电商巨头阿里巴巴,小到无名小公司,我们均可看到 Java 的身影. 我是 2010 年开始接触 Java 语言的,在我刚刚接触 Java 的时候,我经常对于 Java 中的一些基本概念弄不清楚.例如:JDK 7 与 Java SE 7 有什么区别?JDK 与 JRE 有什么区别 ?Java SE 与 Java…
跟许多人一样,我一开始接触 Java 虚拟机只是因为面试需要用到,所以硬着头皮看看.所以很多人对于为什么要学虚拟机这个问题,他们的答案都是:因为面试.但我经过了几年的学习和实战,我发现其实学习虚拟机并不仅仅在于面试,而在于更深入地理解 Java 这门语言,以及为未来排查线上问题打下基础. 先聊聊我的第一个观点:学习 Java 虚拟机能深入地理解 Java 这门语言.对于刚刚工作一两年的朋友来说,各个 API 都没用熟,自然不会去深入研究 Java 中的各种细节.但对于工作了三年以后的朋友来说,很…
相对于C.C++等语言来说,Java语言一个很美好的特性就是自动内存管理机制.C语言等在申请堆内存时,需要malloc内存,用完还有手动进行free操作,若程序员忘记回收内存,那这块内存就只能在进程退出时,由操作系统来释放了.而Java程序员(初级)则基本上不需要对内存分配.回收做过多的关注,完全由Java虚拟机来管理.不过,一旦出现内存泄漏或者溢出,如果不理解JVM管理内存的机制,又如何排除错误.调优系统呢? 1.    运行时区域 1.1程序计数器 Java程序最终编译成字节码运行在JVM之…
背景:长久以来,对java编程中的注释不甚理解.再次学习<疯狂JAVA讲义>基础,深深的感到自己基本功的不牢固.所以要做到事无巨细,好好修炼. 认识注释 常识 注释的作用: 回顾原有的代码,快速理解原有的编程思路,提高效率,节省人生时间. 可读性第一,效率第二.提升与团队的写作能力. 代码即文档,使源代码更加的规范. 注释的分类: 单行注释 多行注释 文档注释 如果编写java源代码时添加了合适的文档注释,然后通过JDK提供的javadoc工具可以直接将源代码里的文档注释提取成一份系统的API…
js经典试题之w3规范系列 1:w3c 制定的 javascript 标准事件模型的正确的顺序? 答案:事件捕获->事件处理->事件冒泡 解析:先事件捕获从windows > document 往下级直到 特定的事件节点,然后进行事件处理,再事件冒泡,从特定节点往上级,这个完整的过程 2:列举javascript  Browser 对象? 答案: Navagator:提供有关浏览器的信息 Window:Window对象处于对象层次的最顶层,它提供了处理Navagator窗口的方法和属性…