JVM总括三-字节码、字节码指令、JIT编译执行
JVM总括三-字节码、字节码指令、JIT编译执行
目录:JVM总括:目录
java文件编译后的class文件,java跨平台的中间层,JVM通过对字节码的解释执行(执行模式,还有JIT编译执行,下面讲解),屏蔽对操作系统的依赖。一个字节(8位)可以储存256中不同的指令,这样的指令就是字节码,java所有指令有200个左右,这些指令组成了字节码文件(.class)。
一、字节码的主要指令:
.class文件里面的十六进制文件(如:图一),其中CAFE BABE是标志这个文件为java的编译后的文件,00000034代表版本号,01670700一个字节(8位)就是一个字节指令,由于数值指令太难看懂,我们可以用javap将指令翻译为助记指令(如:图二)。
图一
图二
1、加载或储存指令
在栈帧中,通过指令操作数据在局部变量表与操作栈间传递。
- ILOAD、ALOAD:将int、对象引用类型从局部变量表压入操作栈顶;
- ISTORE、ASTORE:将int、对象引用类型从操作栈顶储存到局部变量表里;
- ICONST、BIPUSH、SIPUSH、LDC:将常亮加载到操作栈顶。
2、运算指令
对操作栈上的值进行运算,并把结果写入操作栈顶,如IADD、IMUL。
3、类型转换指令
I2L、D2F
4、对象创建与访问指令
NEW
除了字节码指令外,还包括像LINENUMBER储存字节码与源码对应,方便调试定位;LOCALVARIABLE储存当前方法使用到的局部表量表。
二、java源码文件转化为字节码(.class)文件的过程
JAVA源文件---------->词法解析---------->语法解析---------->语义分析--------->生成字节码--------->字节码文件
词法分析:根据空格分割出单词、操作符等,形成token信息流;
语法分析:根据token流和java语法规范生成语法树;
语义分析:检查关键字、类型匹配是否正确;
三、执行模式
1、解释执行
JVM通过加载到的字节码进行执行;
2、JIT编译执行
将热点代码(例如:高频方法体、循环体、公共模块)直接翻译成机器码,提高以后的执行效率;
3、JIT编译执行与解释执行混合执行(主流JVM执行模式)
每次方法调用的时候,方法调用计数器加1,如果计数达到阈值,请求编译成机器码,将机器码放在Code cache里面,下次执行查看是否已编译成机器码,已编译的直接执行机器码,没有编译的通过解释执行(也就是执行字节码);
JVM总括三-字节码、字节码指令、JIT编译执行的更多相关文章
- JVM总括:目录
JVM总括:目录 JVM总括一-JVM内存模型 JVM总括二-垃圾回收:GC Roots.回收算法.回收器 JVM总括三-字节码.字节码指令.JIT编译执行 JVM总括四-类加载过程.双亲委派模型.对 ...
- JVM(三)类加载与字节码技术
1.类文件结构 首先获得.class字节码文件 方法: 在文本文档里写入java代码(文件名与类名一致),将文件类型改为.java 在文件对应目录下运行cmd,执行javac XXX.java 以下是 ...
- 【JVM源码解析】模板解释器解释执行Java字节码指令(上)
本文由HeapDump性能社区首席讲师鸠摩(马智)授权整理发布 第17章-x86-64寄存器 不同的CPU都能够解释的机器语言的体系称为指令集架构(ISA,Instruction Set Archit ...
- JVM学习笔记——类加载和字节码技术篇
JVM学习笔记--类加载和字节码技术篇 在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的类加载和字节码技术部分 我们会分为以下几部分进行介绍: 类文件结构 字节码指令 编译期处理 类 ...
- Java字节码里的invoke操作&&编译时的静态绑定与动态绑定
一个一直运行正常的应用突然无法运行了.在类库被更新之后,返回下面的错误. Exception in thread "main" java.lang.NoSuchMethodErro ...
- 重读《深入理解Java虚拟机》五、虚拟机如何执行字节码?程序方法如何被执行?虚拟机执行引擎的工作机制
Class文件二进制字符流通过类加载器和虚拟机加载到内存(方法区)完成在内存上的布局和初始化后,虚拟机字节码执行引擎就可以执行相关代码实现程序所定义的功能.虚拟机执行引擎执行的对象是方法(均特指非本地 ...
- JVM源码---教你傻瓜式编译openjdk7(JAVA虚拟机爱好者必看)
LZ经过一个星期断断续续的研究,终于成功的搞定了JDK的成功编译与调试.尽管网络上的教程也有不少,包括源码中也有自带的编译步骤说明,但真正自己动手的话,还是会遇到不少意料之外的错误. 为了方便各位猿友 ...
- Java 序列化和反序列化(三)Serializable 源码分析 - 2
目录 Java 序列化和反序列化(三)Serializable 源码分析 - 2 1. ObjectStreamField 1.1 数据结构 1.2 构造函数 2. ObjectStreamClass ...
- C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper(三:附源码)
前言:之前的两篇封装了一些基础的表单组件,这篇继续来封装几个基于bootstrap的其他组件.和上篇不同的是,这篇的有几个组件需要某些js文件的支持. 本文原创地址:http://www.cnblog ...
随机推荐
- git 入门教程之远程仓库
远程仓库 如果说本地仓库已经足够个人进行版本控制了,那么远程仓库则使多人合作开发成为可能. 如果你只是打算自己使用git,你的工作内容不需要发布给其他人看,那就用不到远程仓库的概念. git 是分布式 ...
- git 入门教程之版本管理
版本管理 背景 在上一节中我们已经成功创建版本库并且已经添加test.txt等文件,这一节我们继续讲解如何进行版本控制. 首先我们先查看test.txt 文件有什么内容吧! # 查看文件内容 $ ca ...
- mysql的连接
本文内容: mysql客户端连接服务端 断开连接 首发日期:2018-04-07 mysql客户端连接服务端: 连接服务端的命令基本语法是: mysql -h host -u user -p -P p ...
- Cas 服务器 使用HTTP协议对外服务
在上篇博文<Cas 服务器 下载.编译及部署>Cas启动后默认支持HTTPS连接,如果要使用使用HTTP连接访问,则会收到以下信息: 注:本文是将Cas服务器运行在Http协议模式下,非设 ...
- ArcGIS Server10.2 集群部署注意事项
不接触Server很久了,最近一个省级项目需要提交一个部署方案,由于是省级系统,数据.服务数量都较大,需要考虑采用Server集群的方式来实现.在网上搜罗了以下Server集群的资料,按照步骤一步步来 ...
- Elasticsearch深入搜索之全文搜索及JavaAPI使用
一.基于词项与基于全文 所有查询会或多或少的执行相关度计算,但不是所有查询都有分析阶段. 和一些特殊的完全不会对文本进行操作的查询(如 bool 或 function_score )不同,文本查询可以 ...
- postgre中类似oracle的sql%rowcount用法
get diagnostics cnt := row_count; 现在有两个表tab1和tab2,两个表的格式相同,tab1中有1000条数据,tab2中0条数据 创建测试功能函数 create o ...
- php判断手机是安卓系统还是ios系统
最近项目,要判断用户的手机是安卓的还是ios的,搜了一下相关的资料,最终获得的结果.事实证明,是有效的!主要是要用到HTTP_USER_AGENT,它表示的意思是用来检查浏览页面的访问者在用什么操作系 ...
- Redis学习笔记--Redis数据过期策略详解
本文对Redis的过期机制简单的讲解一下 讲解之前我们先抛出一个问题,我们知道很多时候服务器经常会用到redis作为缓存,有很多数据都是临时缓存一下,可能用过之后很久都不会再用到了(比如暂存sessi ...
- 数据库索引 引用树形结构 B-数 B+数
MySQL 为什么使用B+数 B-树和B+树最重要的一个区别就是B+树只有叶节点存放数据,其余节点用来索引,而B-树是每个索引节点都会有Data域. 这就决定了B+树更适合用来存储外部数据,也就是所谓 ...