本文翻译自:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html 第二章 虚拟机结构 本文档描述了一个抽象的虚拟机规范,并不描述某个特定的虚拟机实现. 要正确实现一个Java虚拟机,你只需要能够读取class文件的格式并正确执行其中指定的操作.具体的实现并不是java虚拟机规范的一部分,因为它们会限制实现者的创造力.比如,运行时数据区域的内存布局,垃圾回收使用的算法,以及任何的java虚拟机指令的内部优化(如:转换为机器码)…
2.11 指令集简介 java虚拟机指令由一个字节的操作码,接着时0个或多个操作数组成,操作码描述了执行的操作,操作数提供了操作所需的参数或者数据.许多指令没有操作数只包含一个操作码. 如果忽略异常处理,那java虚拟机使用下面的伪代码循环即可有效工作: do{ 自动计算pc然后获取pc中的操作码; if (存在操作数) 获取操作数; 执行这个操作码定义的操作 }while(是否有更多需要执行); 操作数的数量和大小都有操作码决定.如果一个操作数大于一个字节,那么它将以大端顺序存储——高位在前.…
2.5 运行时数据区域 java虚拟机定义了多个用于程序执行期间的运行时数据区域.这些数据区域中一些随着java虚拟机的启动而创建,随着虚拟机的退出而销毁.其他的数据区域时和线程相关的.线程相关数据区域随着线程的创建而创建,随着线程的退出而销毁. 2.5.1 pc寄存器 java虚拟机支持多个线程同时执行.每个线程拥有自己的pc(program counter)寄存器.在任何时刻,一个线程只会执行一个方法,即线程的当前方法.如果执行的方法不是本地(native)方法,pc寄存器包含当前正在执行的…
3.12 抛出和处理异常 在程序中使用throw关键字来抛出异常.编译结果很简单. void cantBeZero(int i) throws TestExc { if (i == 0) { throw new TestExc(); } } 编译为: Method void cantBeZero(int) iload_1 // (i) ifne // If i==, allocate instance and throw new # // Create instance of TestExc d…
本文翻译自:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html 第三章 java虚拟机的编译 java虚拟机是设计用来支持java编程语言的.Oracle的JDK软件包含了一个将Java源代码编译成java虚拟机指令集的编译器,以及一个用于java虚拟机本身的运行时系统.了解编译器如何使用java虚拟机对编译器作者来说是有用的,同样也有助于理解java虚拟机本身.本章中编号的部分不是规范性的. 注意,术语“编译器”有时用于…
2.10 异常 java虚拟机中的异常用Throwable类或者它的子类的实例来表示.抛出一个异常会导致立即非本地(an inmediate nolocal)的控制转移,从发生异常的地方跳到处理异常的地方. 大多数异常是在当前线程执行某些操作时同步发生的.对应的,非同步异常可能发生在程序执行的任何阶段.java虚拟机会由于下面三个原因中的一个抛出异常: 执行athrow指令 java虚拟机同步检测到非正常的执行情况.这些异常不是在程序中的任意点抛出的,而是在执行以下指令后同步抛出: 指明异常作为…
2.6. 栈帧 栈帧用于存储数据和部分结果,同样也用于执行动态链接,返回方法的值和分派异常. 当方法被调用的时候会创建一个新的栈帧.当一个方法调用结束时,它对应的栈帧就被销毁了,不管是正常调用结束还是意外结束(抛出了未被捕获的异常).栈帧分配在线程创建的虚拟机栈中.每个栈帧都有自己的局部变量表,操作数栈,以及当前方法的类的运行时常量池的引用. 可以使用附加的特定于实现的信息来扩展帧,例如调试信息 局部变量表和操作数栈在编译时期就确定了,并且通过栈帧关联的方法的code提供.因此栈帧的大小仅仅取决…
2.7 对象的表示 java虚拟机并不要求对象满足任何特定的内部结构. 在Oracle的一些Java虚拟机实现中,对类实例的引用是指向句柄的指针,该句柄本身是一对指针:一个指向包含对象方法的表和指向表示Class对象的指针对象的类型,另一个是从堆为对象数据分配的内存. 2.8 浮点算法 Java虚拟机包含IEEE二进制浮点运算标准(ANSI / IEEE Std.754-1985,New York)中规定的浮点运算的子集. 2.8.1 Java虚拟机浮点算法和IEEE 754 Java虚拟机支持…
3.6 接受参数 如果n个参数传给一个实例的方法,按照约定,它们被接受并放在这个新方法创建的栈帧中的局部变量表里,在局部变量表中的序号从1到n.这些参数按照它们传递过来的顺序存放.例如: int addTwo(int i, int j) { return i + j; } 编译为 Method int addTwo(int,int) iload_1 // (i) iload_2 // (j) iadd // Add; leave int result on operand stack iretu…
3.3 算术运算 java虚拟机通常在操作数栈上进行算术运算(例外情况是iinc指令,它直接增加一个局部变量的值).例如下面的align2grain()方法,它的作用是将int值对齐到2的指定次幂: int align2grain(int i, int grain) { return ((i + grain-1) & ~(grain-1)); } 算术运算的操作数是从操作数栈中弹出的,运算结果会压回操作数栈.因此,算术子计算的结果可以作为嵌套计算的操作数.例如.~(grain-1)的计算结果就是…
4.7.1 定义和命名新属性 允许编译器定义和发布的class文件在class文件结构体.field_info结构体.method_info结构体和Code结构体中的attributes表中包含新的属性.允许java虚拟机识别和使用attributes表中的新属性.但是,任何没有在class文件规范中定义的属性都不能影响class文件的语义.java虚拟机的实现需要忽略它们不能识别的属性. 例如,允许定义一个新属性来支持特定供应商的调试.因为java虚拟要需要忽略它们不能识别的属性,为特殊jav…
第四章 class文件格式 本章介绍了java虚拟机的class文件格式.每一个class文件包含一个单独的类或者接口的定义.虽然类和接口不一定都定义在文件中(比如类和接口亦可以通过类加载器直接生成),我们将通俗地将类或接口的任何有效表示称为class文件格式.class文件是由8位的字节流组成.所有16位,32位和64位的数字都是分别通过读取两个.四个和八个连续的8位字节来构成.多字节的数据使用大端模式存储的,也就是高字节在前.在java se平台,这个格式由接口java.io.DataInp…
代码要是没有注释,对读者来说就是一堆乱七八糟的字母,为了提高代码的可读性和可维护性,必须对代码进行必要的注释,这里小编整理了一下java注释规范. (一)技巧 1:注释当前行快捷方式:ctrl+/ 2:/* */  选上要注释的代码 ctrl+Shift+/ (二)在哪些地方加注释? 1:每个源文件开头都应有一组注释,包含代码的作者,时间: 2:当编写的代码较长,并且包含了多层嵌套时,花括号会比较多,比较乱,为了方便阅读,应该在某些段落结束的地方加注释,注明该闭合花括号对应的起点: 3:每个方法…
想要成为一个优秀的程序员,首先要培养良好的编程习惯,为了提高代码的可读性,必须有好的命名规范. 这篇文章是小编结合网上的很多资料整理出来的,若有不当或错误的地方,欢迎大家指正 在文章开始前,为方便阅读,先简单介绍一点知识 驼峰命名法:驼峰命名法就是当变量名或函数名是由一个或多个单字连结在一起,而构成的一识别字时,第一个单字以小写字母开始,第  二个单字的首字母大写或每一个单字 的首字母都采用大写字母例如:myFirstProject. java命名规范: 项目名:           1:一部分…
现在收集到如下有用的信息: 阿里巴巴公开的Java开发规范:https://yq.aliyun.com/articles/69327?utm_content=m_10088 google公开的Java开发规范:http://www.hawstein.com/posts/google-java-style.html 阅读两者的开发规范,可以看出有一些规范是一样的,(也许是阿里借鉴的谷歌的...)两者中一样的开发规范更要去遵守. 阿里的开发规范更详细. 另外一个: http://code.youme…
4.7 属性 属性用于class文件格式中的ClassFile,field_info,method_info和Code_attribute结构. 所有的属性都是下面的格式: attribute_info { u2 attribute_name_index; u4 attribute_length; u1 info[attribute_length]; } 对于所有的属性,attribute_name_index是类文件常量池中有效的16位索引.在这个索引位置的常量池条目必须是CONSTANT_U…
4.5 字段 字段使用field_info结构来描述. 在同一个class文件中的两个字段不能有相同的名称和描述符. 结构的格式如下: field_info { u2 access_flags; u2 name_index; u2 descriptor_index; u2 attributes_count; attribute_info attributes[attributes_count]; } field_info结构中的项目如下: access_flags access_flags的值是…
4.7.5 Exceptions 属性 Exceptions 属性是一个变长属性,它位于 method_info(§4.6)结构的属性表中. Exceptions 属性指出了一个方法需要检查的可能抛出的异常.一个 method_info 结构中最多只能有一个 Exceptions 属性. Exceptions 属性格式如下: Exceptions_attribute { u2 attribute_name_index; u4 attribute_length; u2 number_of_exce…
4.4 常量池 java虚拟机指令并不依赖类.接口.类实例或者数组的运行时布局.相反,指令依靠常量池中的符号信息. 所有的常量池条目都有如下的通用结构: cp_info { u1 tag; u1 info[]; } 常量池表中的每一个项目是以1比特的标识位开始,指示是哪种cp_info条目.info数组的内容由标志位来决定.有效的标识以及对应的值见表4.4-A.每个标识位后面必须跟2个或更多字节,这些字节给出了这些指定常量的信息.额外信息的格式由标识值来决定. 表4.4-A 常量池标识 Cons…
4.7.4 StackMapTable 属性 StackMapTable 属性是一个变长属性,位于 Code(§4.7.3)属性的属性表中.这个属性会在虚拟机类加载的类型阶段(§4.10.1)被使用. StackMapTable 属性包含 0 至多个栈映射帧(Stack Map Frames),每个栈映射帧都显式或隐式地指定了一个字节码偏移量,用于表示局部变量表和操作数栈的验证类型(Verification Types §4.10.1). 类型检测器(Type Checker)会检查和处理目标方…
一.Java平台的结构图 二.JVM与JRE.JDK关系? JVM:Java Virtual Machine(Java虚拟机),负责执行符合规范的Class文件 JRE:Java Runtime Environment(java运行环境),包含JVM和类库         JDK:Java  Development Kit(java开发工具包),包含JRE和开发工具包,例如javac.javah 相关文章:http://blog.csdn.net/ljheee/article/details/5…
前言 java虚拟机是java跨平台的基石,本文的描述以jdk7.0为准,其他版本可能会有一些微调. 引用 java虚拟机规范 数据类型 java总共有两种数据类型:基本类型和引用类型.java虚拟机的设计目标是期望在运行前执行类型识别,并且通过编译器识别而不是jvm虚拟机本身.具体的类型如下所示: 基本类型: numeric,如int.float.double等 boolean,实际上boolean类型与int类型在jvm中的处理方式是一样的,也是8bit,true和false分别映射为1和0…
代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步. 7.1 概述 上一章我们了解了Class文件存储格式的具体细节,在Class文件中描述的各种信息,最终都需要加载到虚拟机中之后才能运行和使用.而虚拟机如何加载这些Class文件?Class文件中的信息进入到虚拟机后会发生什么变化?这些都是本章将要讲解的内容. 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载…
本文转自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star哈 文章将同步到我的个人博客: www.how2playlife.com 本文是微信公众号[Java技术江湖]的<深入理解JVM虚拟机>其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,…
第一次学习看字节码文件,这个对工作没什么用,但是会提升内功. 首先介绍两个IDEA插件以及使用: BinEd:以16进制格式查看class文件 使用方法:右键class文件,点击Open as binary JClassLib:以一种更为方便的方式查看字节码,相当于javap -v HelloWorld.class 使用方法:光标锁定在java源文件-->选IDEA上方菜单-->Show Bytecode With Jclasslib 分析如下java代码的字节码文件 package com.…
原文:JVM内存结构 VS Java内存模型 VS Java对象模型 Java作为一种面向对象的,跨平台语言,其对象.内存等一直是比较难的知识点.而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚.比如本文我们要讨论的JVM内存结构.Java内存模型和Java对象模型,这就是三个截然不同的概念,但是很多人容易弄混. 可以这样说,很多高级开发甚至都搞不不清楚JVM内存结构.Java内存模型和Java对象模型这三者的概念及其间的区别.甚至我见过有些面试官自己也搞的不是太清楚.不信的话,你去网上…
JVM内存结构 我们都知道,Java代码是要运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途. 其中有些区域随着虚拟机进程的启动而存在,而有些区域则依赖用户线程的启动和结束而建立和销毁.在<Java虚拟机规范(Java SE 8)>中描述了JVM运行时内存区域结构如下: 各个区域的功能不是文本重点,就不在这里详细介绍了.这里简单提几个需要特别注意的点: 1.以上是Java虚拟机规范,不同的虚拟机实现会各有不同,但是一般会遵守…
前面几篇文章中, 系统的学习了下JVM内存结构.Java内存模型.Java对象模型, 但是发现自己还是对这三者的概念和区别比较模糊, 傻傻分不清楚.所以就有了这篇文章, 本文主要是对这三个技术点再做一个总结和区分, 加深印象. JVM内存结构 在<Java虚拟机规范(Java SE 8)>中描述了JVM运行时内存区域结构如下: 也就是说, JVM内存结构由Java虚拟机规范定义, 其描述的是Java程序执行过程中, 由JVM管理的不同的数据区域. Java内存模型 在计算机世界中, 为了保证共…
本文由 简悦 SimpRead 转码, 原文地址 https://www.toutiao.com/i6732361325244056072/ 作者:Hollis 来源:公众号Hollis Java 作为一种面向对象的,跨平台语言,其对象.内存等一直是比较难的知识点.而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚.比如本文我们要讨论的 JVM 内存结构.Java 内存模型和 Java 对象模型,这就是三个截然不同的概念,但是很多人容易弄混. 可以这样说,很多高级开发甚至都搞不不清楚 JV…
JVM内存结构 我们都知道,Java代码是要运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途.其中有些区域随着虚拟机进程的启动而存在,而有些区域则依赖用户线程的启动和结束而建立和销毁.在<Java虚拟机规范(Java SE 8)>中描述了JVM运行时内存区域结构如下: 各个区域的功能不是本文重点,就不在这里详细介绍了.这里简单提几个需要特别注意的点: 1.以上是Java虚拟机规范,不同的虚拟机实现会各有不同,但是一般会遵守规…