什么是“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文件的组织结构:

  1. 魔数:用来表示这个class文件的类型,魔数的作用就相当于文件后缀名,只不过后缀名容易被修改,不安全,因此在class文件中用魔数表示文件类型比较合适。
  2. 本文件的版本信息:它表示本class中使用的是哪个版本的JDK。在高版本的JVM上能够运行低版本的class文件,但在低版本的JVM上无法运行高版本的class文件,即使该class文件中没有用到任何高版本JDK的特性也无法运行!
  3. 常量池:

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字节表示。

  1. 访问标志:访问标志是用来表示这个class文件是类还是接口、是否被public修饰、是否被abstract修饰、是否被final修饰等。
  2. 类索引、父类索引、接口索引集合: 类索引、父类索引、接口索引集合是用来表示当前class文件所表示类的名字、父类名字、接口们的名字。
  3. 字段表集合: 字段表用来存储本类涉及到的成员变量,包括实例变量和类变量,但是不包括方法中的局部变量。每一个字段表示一个成员变量,本类中所有的成员变量组成字段表。
  4. 方法表集合:在class文件中,所有的方法都是以二维表的形式来存储,每一张表表示一个函数,一个类中的所有方法构成方法表的集合。方法表集合的结构和字段表集合的结构一致,只不过访问标志和属性表集合的可选项有所不同。
  5. 方法表集合的注意点:

a)        如果class文件没有重写父类的方法,那么本class文件的方法表集合中不会出现父类/父接口的方法表

b)        本class文件的方法表中可能出现程序员没有定义的方法,因为在编译类的时候编译器会在class文件的方法表集合中加入类构造器和实例构造器。

c)        重载一个方法需要有相同的简单名称和不同的特征签名。JVM的特征签名和Java的特征签名不一样:Java的特征签名(方法参数在常量池中的字段符号引用的集合);JVM的特征签名(方法参数+返回值)

深入理解JVM(10)——Class文件结构的更多相关文章

  1. 深入理解JVM(六)类文件结构

    6.1 关于类文件 1.class文件的一次编译,到处运行的跨平台性: 2.JVM不止有跨平台性,还有跨语言性,不管是JRuby还是Groovy写出来的程序,只要编译出符合JVM规范的class文件就 ...

  2. [译]深入理解JVM

    深入理解JVM 原文链接:http://www.cubrid.org/blog/dev-platform/understanding-jvm-internals 每个使用Java的开发者都知道Java ...

  3. 转:深入理解jvm

    深入理解JVM 原文链接:http://www.cubrid.org/blog/dev-platform/understanding-jvm-internals 每个使用Java的开发者都知道Java ...

  4. 【转】[译]深入理解JVM

    http://www.cnblogs.com/enjiex/p/5079338.html 深入理解JVM 原文链接:http://www.cubrid.org/blog/dev-platform/un ...

  5. [译]深入理解JVM Understanding JVM Internals

    转载: 英文原版地址:http://www.cubrid.org/blog/dev-platform/understanding-jvm-internals/ 翻不了墙的可以看这个英文版:https: ...

  6. 深入理解JVM内幕(转)

    转自:http://blog.csdn.net/zhoudaxia/article/details/26454421/ 每个Java开发者都知道Java字节码是执行在JRE((Java Runtime ...

  7. 深入理解JVM内幕:从基本结构到Java 7新特性

    转自:http://www.importnew.com/1486.html 每个Java开发者都知道Java字节码是执行在JRE((Java Runtime Environment Java运行时环境 ...

  8. 深入理解JVM垃圾收集机制(JDK1.8)

    垃圾收集算法 标记-清除算法 最基础的收集算法是"标记-清除"(Mark-Sweep)算法,分两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象. 不足: ...

  9. 《深入理解JVM虚拟机》读书笔记

    前言:<深入理解JVM虚拟机>是JAVA的经典著作之一,因为内容更偏向底层,所以之前一直没有好好的阅读过.最近因为刚好有空,又有了新目标.所以打算和<构架师的12项修炼>一起看 ...

  10. 理解JVM GC

    理解JVM GC对于我们把控Java应用有很大的帮助.下面我从运维角度,把网上的JVM相关的资料整理如下,以加深对JVM GC的理解.如有错误的地方,请看官指正. JVM内存使用分类 JVM的内存分区 ...

随机推荐

  1. Docker建立自己的私有仓库

    拉去仓库镜像 docker pull registry:latest 创建存储账户的文件夹路径 mkdir -p /{dir}/auth/ 创建用户密码信息文件 docker run --entryp ...

  2. django-会话 cookie 中缺少HttpOnly 属性-安全加强

    如果django程序扫描到会话 cookie 中缺少 HttpOnly 属性问题,需要如何进行安全加强? https://docs.djangoproject.com/en/2.2/ref/setti ...

  3. jQuery中的extend()方法

    通常我们使用jquery的extend时,大都是为了实现默认字段的覆盖,即若传入某个字段的值,则使用传入值,否则使用默认值.如下面的代码: function getOpt(option){ var _ ...

  4. Entity Framework介绍

    1.Entity Framework介绍 下图显示EF整体架构.现在我们来看看架构的各个组件: EDM(Entity Data Model): EDM由三个主要部分组成:概念模型,映射和存储模型.映射 ...

  5. 【Android】android:manageSpaceActivity让应用手动管理应用的数据目录

    今天在Android遇到一个需求,不允许用户完全清除应用私有目录(/data/data/包名/),但是Android默认情况下用户通过在应用信息里面点击清除数据按钮把所有的应用私有目录下的的数据文件完 ...

  6. (三)apache的安装与配置

    一.安装: 推荐使用cygwin自带的Setup.exe.带来的好处不言而喻,所有安装的程序都是经过测试的,这样确保你不会把宝贵的时间浪费来毫无意义的劳动上. 在安装程序中选择两个包就行了(分别是ap ...

  7. python的paramiko模块

        paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接.paramiko支持Linux, Solaris, BSD, MacOS X, ...

  8. 大数据——hbase

    进入hbase hbase shell 部分命令清单 查询服务器状态   status 查询hbase版本   version 1. 创建一个表 create 'table1', 'tab1_id', ...

  9. nginx与php-fpm通信的两种方式

    简述 在linux中,nginx服务器和php-fpm可以通过tcp socket和unix socket两种方式实现. unix socket是一种终端,可以使同一台操作系统上的两个或多个进程进行数 ...

  10. HDU5470 Typewriter SAM 动态规划 单调队列

    原文链接https://www.cnblogs.com/zhouzhendong/p/HDU5470.html 题目传送门 - HDU5470 题意 你需要写一个只包含小写字母的字符串 $s$ . 你 ...