深入理解Java虚拟机4-chap6-斗者1星
一、JVM语言无关性
1.以字节码为基础(Class文件为一组以8位字节为基础单位的二进制流),JVM与Class文件关联,而非与Java语言关联

2.代码编译从本地码(Native Code)转为字节码:本地机器码,依赖于OS,不具备跨平台特性
二、Class文件
Class文件中只有两种数据类型:无符号数和表
- 无符号数:u1、u2、u4、u8,可以用来描述数字、索引引用、数量值或者字符串值
- 表:多个无符号数或者其他表构成的复合数据类型,表一般以_info结尾

1.魔数字与版本号
- 唯一目的:确定这个文件是否是能被虚拟机接受的Class文件
- 魔数:0xCAFEBABE
- 次版本号
- 主版本号
2.常量池:Class文件中的资源仓库
constant_pool_count:从1开始计数,0表示不引用常量池项目
存放两类变量:
- 字面值:类似Java语言常量,如文本字符串、声明为final的常量值
- 符号引用:
a.类和接口的全限定名
b.字段的名称和描述符
c.方法的名称和描述符
常量池中的每一项常量都是一个表,第一位为u1类型的标志位,取值如下:

- 每一项常量中可能有name_index指向常量值得其他项
- 有些常量如“<init>”、()V等会被Class文件中的field_info、method_info、attribute_info引用
3.访问标志:用于标志类或者接口的访问信息

4.类索引、父类索引与接口索引集合:确定类的继承层次关系
- 类引用、父类引用指向一个类型为CONSTANT_Class_info,通过它可以在常量池找到全限定名字符串
5.字段表集合:用于描述接口或者类中声明的变量,包括类变量(静态变量)与实例变量
字段表结构如下:

6.方法表集合
attribute_info:存放编译好的方法代码Code

7.属性表集合
共21中属性如Code等,属性表结构:

Code:

- max_locals:包含隐藏的this指针,当方法显示没有参数时,此值为1,因为要带入this指针这个参数
- code_length:编译好的字节码长度
- code:字节码指令,1个字节长度,所以最多有256种指令
三、字节码指令
1.字节码与数据类型
- JVM虚拟机指令:字节长度固定(1字节)的操作码+随后的0-多个所需参数
- 优点:
可以获得短小精干的编译代码
- 缺点:
8位,最多256种指令
Class文件格式放弃了编译后代码的操作数长度对其,意味着处理超过一个字节数据时,需要从字节中重建出具体结构的数据,影响性能
- 执行模型伪代码:
do {
自动计算PC寄存器的值加1;
根据PC寄存器的指示位置,从字节码中取出操作码;
if (字节码存在操作数) 从字节码流中取出操作数;
执行操作码所定义的操作;
}while(字节码流长度 > 0)
2.指令
- 加载与储存
- 运算
- 类型转换
- 对象创建与访问
- 操作数栈管理
- 控制转移
- 方法调用与返回
- 异常处理
- 同步
深入理解Java虚拟机4-chap6-斗者1星的更多相关文章
- 《深入理解Java虚拟机》虚拟机性能监控与故障处理工具
上节学习回顾 从课本章节划分,<垃圾收集器>和<内存分配策略>这两篇随笔同属一章节,主要是从理论+实验的手段来讲解JVM的内存处理机制.好让我们对JVM运行机制有一个良好的概念 ...
- 《深入理解 java虚拟机》学习笔记
java内存区域详解 以下内容参考自<深入理解 java虚拟机 JVM高级特性与最佳实践>,其中图片大多取自网络与本书,以供学习和参考.
- (1) 深入理解Java虚拟机到底是什么?
好文转载:http://blog.csdn.net/zhangjg_blog/article/details/20380971 什么是Java虚拟机 作为一个Java程序员,我们每天都在写Java ...
- 深入理解java虚拟机(7)---线程安全 & 锁优化
关于线程安全的话题,足可以使用一本书来讲解这些东西.<Java Concurrency in Practice> 就是讲解这些的,在这里 主要还是分析JVM中关于线程安全这块的内容. 1. ...
- 深入理解java虚拟机(6)---内存模型与线程 & Volatile
其实关于线程的使用,之前已经写过博客讲解过这部分的内容: http://www.cnblogs.com/deman/category/621531.html JVM里面关于多线程的部分,主要是多线程是 ...
- 深入理解java虚拟机(5)---字节码执行引擎
字节码是什么东西? 以下是百度的解释: 字节码(Byte-code)是一种包含执行程序.由一序列 op 代码/数据对组成的二进制文件.字节码是一种中间码,它比机器码更抽象. 它经常被看作是包含一个执行 ...
- 深入理解java虚拟机(4)---类加载机制
类加载的过程包括: 加载class到内存,数据校验,转换和解析,初始化,使用using和卸载unloading过程. 除了解析阶段,其他过程的顺序是固定的.解析可以放在初始化之后,目的就是为了支持动态 ...
- 深入理解java虚拟机(1)------内存区域与内存溢出
在C++领域,关于C++的内存存储,结构等等,有一本书:深度探索C++对象模型,讲解的非常透彻. 而Java确把这一工作交给了虚拟机来处理. 我们首先来看看关于内存的问题. 1.问题: 1)java ...
- 什么是HotSpot VM & 深入理解Java虚拟机
参考 http://book.2cto.com/201306/25434.html 另外,这篇文章也是从一个系列中得出的: <深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)> ...
- 【Todo】深入理解Java虚拟机 读书笔记
有一个在线系列地址 <深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)> http://book.2cto.com/201306/25426.html 已经下载了这本书(60多M ...
随机推荐
- create-react-app入门教程
Create React App是FaceBook的React团队官方出的一个构建React单页面应用的脚手架工具.它本身集成了Webpack,并配置了一系列内置的loader和默认的npm的脚本,可 ...
- 2.4G还是5G?带你选择最正确的路由器
智能设备井喷的时代,无线路由器成为家庭中最重要的电器设备.稳定性.连接速度.信号强弱都是无线路由使用体验的重要组成部分.究竟如何选购与配置路由器才能得到最好的用户体验呢? 当你在选购无线路由器的时候是 ...
- IE 浏览器不支持 ES6 Array.from(new Set( )) SCRIPT438: 对象不支持“from”属性
[转]解决老浏览器不支持ES6的方法 现象: Array.from(new Set( )) SCRIPT438: 对象不支持“from”属性或方法 解决方法: 安装babel 引入browser. ...
- java web service 写入图片到web/img/
获取本类service路径,然后字符串截取和拼接 String classpath= this.getClass().getResource("/").getPath(); Str ...
- linux中,当执行rpm -e删除一个软件包时,都做了些什么事
问题描述: 今天在通过rpm进行删除软件包时,出现了问题,就引发了我对于rpm包执行删除动作时的一些行为做了思考,之前找了很多的文章,后来想如果有debug日志信息,那么不就都清楚了吗 通过打印rpm ...
- String 源码探究
起因:忽然想到平时用的HashMap 当key是字符串的时候为什么总可以覆盖,然后看了String的源码发现: private final char value[]; private int hash ...
- Jquery EasyUI Combotree和 EasyUI tree展开所有父节点和获取完整路径
Jquery EasyUI Combotree展开所有父节点 Jquery EasyUI Combotree获取树完整路径 Jquery EasyUI tree展开所有父节点 Jquery EasyU ...
- 异常处理与MiniDump 用于投放市场c++异常捕获
最近一段时间,新上线的软件在外场偶尔会出现异常崩溃的情况.由于试用范围比较分散,很难一一前往现场定位问题.而传统的log日志方法,在崩溃的情况下,并不能比较准确的表示出问题位置,这使得软件调试进程缓慢 ...
- Namespace declaration statement has to be the very first statement in the script-去除bom头
今天准备测试小程序的签名加密,但是刚引入官方的“加密数据解密算法”文件到项目里,然后为每个文件添加命名空间的时候,不管怎么加都报“Namespace declaration statement has ...
- Educational Codeforces Round 50
1036A - Function Height 20180907 \(ans=\left \lceil \frac{k}{n} \right \rceil\) #include<bits/ ...