深入理解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的内存分区 ...
随机推荐
- Greenplum和Postgresql的主键自增
参考:https://blog.csdn.net/u011042248/article/details/49422305 1.第一种情况就是创建数据表的时候创建主键自增,由于业务需要自己的数据表已经创 ...
- Spark的Streaming + Flume进行数据采集(flume主动推送或者Spark Stream主动拉取)
1.针对国外的开源技术,还是学会看国外的英文说明来的直接,迅速,这里简单贴一下如何看: 2.进入到flume的conf目录,创建一个flume-spark-push.sh的文件: [hadoop@sl ...
- YOLO V2 代码分析
先介绍YOLO[转]: 第一个颠覆ross的RCNN系列,提出region-free,把检测任务直接转换为回归来做,第一次做到精度可以,且实时性很好. 1. 直接将原图划分为SxS个grid cell ...
- 第四次作业之oop
第四次作业 四则运算 类 输入类:用户输入题数和答案,语言选择. 生成类:随机数字,运算符,生成表达式. 读取类:读取表达式,计算正确答案. 界面类:选择语言,输出正确题数和答案. 类与类之间是如何进 ...
- 怎样把linux客户端用户禁止用 su命令来切换用户
系统中有一个组叫做“wheel”,我们可以利用该组实现一些特殊的功能.我们可以将拥有su使用权限的用户加入到wheel组中并且对该组进行限制,那么只有在该组中的用户才有su的使用权限. 如要实现该功能 ...
- Python题目练习(二)
1.如何实现对python列表去重,并保持原来顺序 li = [1,2,5,3,1,6,3,8,0,3,2,4] l = [] for i in li: if i not in l: l.append ...
- P1080 国王游戏 贪心 高精度
题目描述 恰逢 HH国国庆,国王邀请nn 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 nn 位大臣排成一排,国王站在队伍的 ...
- Hudson与Jenkins
Hudson是Jenkins的前身,它们都是基于Java开发的一种持续集成工具,用于监控程序重复的工作,包括: 1.持续的软件版本发布/测试项目. 2.监控外部调用执行的工作. Hudson的特性 1 ...
- Maya 常用环境变量详解
Maya 常用环境变量详解 前言: Maya 的环境变量让用户可以很方便的自定义 Maya 的功能. 在 Maya 的 Help 帮助文档中有专门的一个章节< Environment Varia ...
- Mybatis if test 中int integer判断非空的坑
Mybatis 中,alarmType 是int类型.如果alarmType 为0的话,条件判断返回结果为false,其它值的话,返回true. 1 <if test="alarmTy ...