深入理解JVM(10)——Class文件结构
什么是“JVM”的无关性
Java具有平台无关性,也就是任何操作系统都能够运行Java代码,之所以能够实现这一点,是因为Java运行在虚拟机上,不同的操作系统都有各自的Java虚拟机,从而实现一次编译,到处运行。
JVM不仅具有平台无关性,还具有语言无关性。平台无关性是指不同的操作系统都有各自的JVM来运行Java代码,但语言无关性是指Java虚拟机能运行除了Java之外的代码,只是对能运行的语言有严格的要求。
Java源代码首先需要使用Javac编译器编译程class文件,然后启动JVM执行class文件,从而程序开始执行。言外之意就是JVM只认识class文件,它不管是何种语言生成了class文件,只要class文件符合JVM的规范就行。因此目前已经有Scala、JRuby、Jython等语言能够在JVM上运行。它们有各自的语法规则,不过它们的编译器都能将各自的源码编译成符合JVM规范的class文件,从而能够借助JVM运行它们。
Class文件结构:
class文件是二进制文件,它的内容具有严格的规范,文件中没有空格,全部都是连续的0/1,class文件中的全部内容被分为两部分内容:无符号数(它表示class文件中的值,这些值没有任何类型,但有不同的长度)和表(class文件中的数据要么是单个值,要么是二维表。)。
class文件的组织结构:
- 魔数:用来表示这个class文件的类型,魔数的作用就相当于文件后缀名,只不过后缀名容易被修改,不安全,因此在class文件中用魔数表示文件类型比较合适。
- 本文件的版本信息:它表示本class中使用的是哪个版本的JDK。在高版本的JVM上能够运行低版本的class文件,但在低版本的JVM上无法运行高版本的class文件,即使该class文件中没有用到任何高版本JDK的特性也无法运行!
- 常量池:
a) 通常存放两种类型的常量:字面值常量和符号引用。
b) 常量池的特点:
1) 常量池的长度不固定
2) 常量池中的常量由二维表来表示
3) 常量池是class文件的资源仓库
4) 常量池是与本class文中其他部分联系最紧密的一部分
5) 常量池是class文件中占空间最大的一部分
c) 为什么Java中定义的类名、变量名必须小于64K:类、接口、变量等名字都属于符号引用,它们都存储在常量池中,这种类型的常量使用u2存储字符串的长度。由于2字节最多能表示65535个数,因此这些名字的最大长度最多只能是64K。
d) 什么是UTF-8编码?什么是缩略UTF-8编码:前者每个字符使用3个字节表示,而后者把128个ASKII码用1字节表示,某些字符用2字节表示,某些字符用3字节表示。
- 访问标志:访问标志是用来表示这个class文件是类还是接口、是否被public修饰、是否被abstract修饰、是否被final修饰等。
- 类索引、父类索引、接口索引集合: 类索引、父类索引、接口索引集合是用来表示当前class文件所表示类的名字、父类名字、接口们的名字。
- 字段表集合: 字段表用来存储本类涉及到的成员变量,包括实例变量和类变量,但是不包括方法中的局部变量。每一个字段表示一个成员变量,本类中所有的成员变量组成字段表。
- 方法表集合:在class文件中,所有的方法都是以二维表的形式来存储,每一张表表示一个函数,一个类中的所有方法构成方法表的集合。方法表集合的结构和字段表集合的结构一致,只不过访问标志和属性表集合的可选项有所不同。
- 方法表集合的注意点:
a) 如果class文件没有重写父类的方法,那么本class文件的方法表集合中不会出现父类/父接口的方法表
b) 本class文件的方法表中可能出现程序员没有定义的方法,因为在编译类的时候编译器会在class文件的方法表集合中加入类构造器和实例构造器。
c) 重载一个方法需要有相同的简单名称和不同的特征签名。JVM的特征签名和Java的特征签名不一样:Java的特征签名(方法参数在常量池中的字段符号引用的集合);JVM的特征签名(方法参数+返回值)
深入理解JVM(10)——Class文件结构的更多相关文章
- 深入理解JVM(六)类文件结构
6.1 关于类文件 1.class文件的一次编译,到处运行的跨平台性: 2.JVM不止有跨平台性,还有跨语言性,不管是JRuby还是Groovy写出来的程序,只要编译出符合JVM规范的class文件就 ...
- [译]深入理解JVM
深入理解JVM 原文链接:http://www.cubrid.org/blog/dev-platform/understanding-jvm-internals 每个使用Java的开发者都知道Java ...
- 转:深入理解jvm
深入理解JVM 原文链接:http://www.cubrid.org/blog/dev-platform/understanding-jvm-internals 每个使用Java的开发者都知道Java ...
- 【转】[译]深入理解JVM
http://www.cnblogs.com/enjiex/p/5079338.html 深入理解JVM 原文链接:http://www.cubrid.org/blog/dev-platform/un ...
- [译]深入理解JVM Understanding JVM Internals
转载: 英文原版地址:http://www.cubrid.org/blog/dev-platform/understanding-jvm-internals/ 翻不了墙的可以看这个英文版:https: ...
- 深入理解JVM内幕(转)
转自:http://blog.csdn.net/zhoudaxia/article/details/26454421/ 每个Java开发者都知道Java字节码是执行在JRE((Java Runtime ...
- 深入理解JVM内幕:从基本结构到Java 7新特性
转自:http://www.importnew.com/1486.html 每个Java开发者都知道Java字节码是执行在JRE((Java Runtime Environment Java运行时环境 ...
- 深入理解JVM垃圾收集机制(JDK1.8)
垃圾收集算法 标记-清除算法 最基础的收集算法是"标记-清除"(Mark-Sweep)算法,分两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象. 不足: ...
- 《深入理解JVM虚拟机》读书笔记
前言:<深入理解JVM虚拟机>是JAVA的经典著作之一,因为内容更偏向底层,所以之前一直没有好好的阅读过.最近因为刚好有空,又有了新目标.所以打算和<构架师的12项修炼>一起看 ...
- 理解JVM GC
理解JVM GC对于我们把控Java应用有很大的帮助.下面我从运维角度,把网上的JVM相关的资料整理如下,以加深对JVM GC的理解.如有错误的地方,请看官指正. JVM内存使用分类 JVM的内存分区 ...
随机推荐
- Nancy 自寄宿
一:简介 Self Hosting 顾名思义,就是自己Host自己.也就是不需要依赖别的应用,而让应用本身就是服务.一个Console程序或者一个Winform程序都是一个应用,Self Hostin ...
- js 2017 - 2
设置360为极速模式 <meta name='renderer' content='webkit'> css3超出隐藏 .ellipsis { // 超出一行 width: 100%; ...
- 长短时记忆网络LSTM和条件随机场crf
LSTM 原理 CRF 原理 给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型.假设输出随机变量构成马尔科夫随机场(概率无向图模型)在标注问题应用中,简化成线性链条件随机场,对数线性判别 ...
- bzoj2969矩形粉刷
题解: 和前面那个序列的几乎一样 容斥之后变成求不覆盖的 然后再像差分的矩形那样 由于是随便取的所以这里不用处理前缀和直接求也可以 代码: #include <bits/stdc++.h> ...
- shell常用监控脚本
1.cpu空闲脚本 top -b -n1 |grep 'Cpu'|awk '{print $5}'|sed 's/%//'|sed 's/id,//' 变量赋值 cpu_id='top -b -n1 ...
- js中时间大小的比较
今天在前台做到一个需要比较两个日期大小的地方,乍一看,发现一个比较奇怪地地方: var t1 = new Date(2018,1,1), t2 = new Date(2018,1,1); consol ...
- day5.python列表练习题
写代码,有如下列表,按照要求实现每一个功能 li = [“alex”, “WuSir”, “ritian”, “barry”, “wenzhou”] 1.计算列表的长度并输出 print(len(li ...
- Codeforces 758F Geometrical Progression
Geometrical Progression n == 1的时候答案为区间长度, n == 2的时候每两个数字都可能成为答案, 我们只需要考虑 n == 3的情况, 我们可以枚举公差, 其分子分母都 ...
- Docker 启动tomcat
docker run -d --name jinrong_beijingbank -p 8081:8081 -v /application/docker_hub/java/pypaltform2018 ...
- Codeforces 1000G Two-Paths 树形动态规划 LCA
原文链接https://www.cnblogs.com/zhouzhendong/p/9246484.html 题目传送门 - Codeforces 1000G Two-Paths 题意 给定一棵有 ...