类文件(.class)是搞java的都非常熟悉的文件,一般我们在编写java之后文件之后,首先通过javac工具生成.class类字节码文件,而后在执行程序的时候由虚拟机加载执行。那么为什么要生成.class呢?直接执行.java文件不行吗?下边我们先来大概了解一下java编译执行流程。

一、class文件存在的意义

1、解释执行和编译执行

由于要想解释为什么要生成.class,就需要搞清楚解释执行和编译执行的区别,所以首先我们来普及一个知识点:

编译程序、解释程序、汇编程序是3种语言处理程序。
其区别主要为:
汇编程序(为低级服务)是将汇编语言书写的源程序翻译成由机器指令和其他信息组成的目标程序。解释程序(为高级服务)直接执行源程序或源程序的内部形式,一般是读一句源程序,翻译一句,执行一句,不产生目标代码,如BASIC解释程序。编译程序(为高级服务)是将高级语言书写的源程序翻译成与之等价的低级语言的目标程序。编译程序与解释程序最大的区别之一在于前者生成目标代码,而后者不生成。

汇编程序就不说了,对应后两者我们一般会把语言的执行分为解释执行和编译执行。而我们知道,低级语言是平台相关的,不同操作系统下是不能够通用的,因此编译执行是不能跨平台的(准确的说是其编译后的目标程序),而解释执行却可以用相同的源代码(或中间代码)通过不同解释器在不同的平台上运行。为了更好的理解这一过程,我们分别看一下C++和java的编译、执行过程:
    C++:

Java:

从图中可以看出,在初次编译完成后C++生成了.obj,而java生成了class,理论上其实这两类文件都是跨平台的(前提是obj代码不涉及不同平台特性,比如在调了win32接口)。C++不跨平台关键的点就在于链接的时候会链接对应平台的dll库,因此生成的可执行文件当然不能在其他平台运行。而java所谓的打包只是把class文件打包为jar/war,真正执行是由虚拟机加载后处理的,而虚拟机本身则在不同平台下有不同的实现。JIT可以把部分class文件或解释后的指令(如循环等)生成本机机器码,进行编译执行以提高效率。

2、使用class的好处

将java文件编译成class文件的最主要的原因就是实现跨平台,这一点在前边已经很明显了。第二个原因就是通过class文件,能使虚拟机可以运行其他语言。虚拟机本身和java文件没有关联,它只认识固定格式的class文件,这样一来只要通过编译器把其他语言的源文件编译成这样格式的class,就能在虚拟机上运行,scala、groovy、jython、jruby等都是这样实现的。

二、class文件结构

下边进入正题,class文件是一组以8位字节为基础单位的二进制流,各数据间没有分隔符,严格按照《java虚拟机规范》所规定的位置来表示代表的定义。
    class文件有两种数据类型:无符号数和表,无符号数属于基本类型,有u1,u2,u4,u8四种,u表示单元,后边的数表示占的字节,u1就表示占1个字节的数(并不是数字,代表的意思要根据所处位置来定,可能是地址值、字符串utf8编码等);而表则是由无符号数或其他表组成的复杂类型,其实相当于结构体,习惯性以'_info'结尾。下图是class文件格式:

    从上边结构可以看出,整个文件的大小都是可知的,当出现可变项时(如cp_info),那么它的前一项一定是这个可变项的数量,这在之后要介绍的加载机制中很重要。
    好了,这次先对class文件有个了解,下一次将详细介绍各部分内容。

JVM执行子系统探究——类文件结构初窥的更多相关文章

  1. 【深入理解JAVA虚拟机】第三部分.虚拟机执行子系统.1.类文件结构

    无关性 无关性的体现有两个方面: 1.平台无关性:可在不同的操作系统和机器指令集上执行,可在不同厂商的虚拟机平台上执行. 2.语言无关性:用不同编程语言写出的代码编译生成的文件都可以运行. 实现思想: ...

  2. jvm虚拟机笔记<三> 类文件结构与类加载机制

    java虚拟机具有语言无关系,它只和“class文件“这种特定的二进制文件格式绑定. 不同语言的编译器将对应的程序编译成字节码文件(*.class),送给jvm执行. class文件本质上就是一张表, ...

  3. JVM 之:Class 类文件结构

    类文件结构 Class 文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在 Class 文件中,中间没有添加任何分隔符,这使得整个 Class 文件中存储的内容几乎全部都是 ...

  4. JVM学习笔记(三):类文件结构

    代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步. 实现语言无关性的基础是虚拟机和字节码存储格式.Java虚拟机不和包括Java在内的任何语言绑定,只与&quo ...

  5. JVM学习第三天(JVM的执行子系统)之开篇Class类文件结构

    虽然这几天 很忙,但是学习是不能落下的,也不能推迟,因为如果推迟了一次,那么就会有无数次;加油,come on! Java跨平台的基础: 各种不同平台的虚拟机与所有平台都统一使用的程序存储格式——字节 ...

  6. 深入理解Java虚拟机(类文件结构+类加载机制+字节码执行引擎)

    目录 1.类文件结构 1.1 Class类文件结构 1.2 魔数与Class文件的版本 1.3 常量池 1.4 访问标志 1.5 类索引.父索引与接口索引集合 1.6 字段表集合 1.7 方法集合 1 ...

  7. JVM性能优化系列-(3) 虚拟机执行子系统

    3. 虚拟机执行子系统 3.1 Java跨平台的基础 Java刚诞生的宣传口号:一次编写,到处运行(Write Once, Run Anywhere),其中字节码是构成平台无关的基石,也是语言无关性的 ...

  8. JVM 的执行子系统

    JVM 的执行子系统. 一.Class类文件结构 1. JVM的平台无关性 与平台无关性是建立在操作系统上,虚拟机厂商提供了许多可以运行在各种不同平台的虚拟机,它们都可以载入和执行字节码,从而实现程序 ...

  9. jvm 类文件结构学习

    本文以代码示例来学习 java 类文件的结构,其中对类文件结构的学习均来自周志明先生所著的 <深入理解 Java 虚拟机>一书,在此表示诚挚的感谢. 代码如下: package com.r ...

随机推荐

  1. spring Cloud中,解决Feign/Ribbon整合Hystrix第一次请求失败的问题?

    Spring Cloud中,Feign和Ribbon在整合了Hystrix后,可能会出现首次调用失败的问题,要如何解决该问题呢? 造成该问题的原因 Hystrix默认的超时时间是1秒,如果超过这个时间 ...

  2. Mysql order by 排序 varchar 类型数据

    Mysql order by 排序 varchar 类型数据 varchar 类型字段排序,  会將数字当成字符串来处理.  排序规则一般是从左到右一位位来比较. +0之后 就转化成INT 类型排序 ...

  3. 如何在CSS中解决长英文单词的页面显示问题?CSS3

    简言 在页面排版中,经常遇到长英文单词溢出段落容器的情况,如何解决该问题?现编制如下对比演示程序: 演示程序 42du.cn-在线演示程序 部分html代码 <div class="b ...

  4. PHP变量、数据类型、字符串、运算符、条件语句、循环语句、数组、函数

    PHP 简介: php :是一门动态交互的计算机语言  静态交互 html  css  js 但凡是动态交互的 都需要服务器. php都是以.php结尾的文件 Html文件里不能写php代码,但是ph ...

  5. echarts使用中的那些事儿( 三)

    饼图上的那些字与下面说明性的文字有些重合,该怎么缩小圆形的大小呢,还有它的位置,怎么让它向上一些或者向下一些: 有以下两个属性可以解决问题: radius : '55%', ------------这 ...

  6. Git入门学习总结

    用了两天时间看完廖雪峰老师的git教程(http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b0 ...

  7. 51nod 1276 岛屿的数量

    题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 有N个岛连在一起形成了一个大的岛屿,如果海平面上升超过某些岛的高度时,则这个岛会被淹没 ...

  8. 【TensorFlow入门完全指南】神经网络篇·MLP多层感知机

    前面的不做过多解释了. 这里定义了两个占位符,各位也知道,在训练时,feed_dict会填充它们. 定义相关网络. 这里是权值矩阵和偏差. 这里是实例化了网络,定义了优化器和损失,和上一篇一样. 最后 ...

  9. 【Python图像特征的音乐序列生成】GitHub已经有人将mingus改到了Python3版本

    https://github.com/bspaans/python-mingus/issues/45 注意此时的安装方法应该是: git clone https://github.com/edudob ...

  10. ECshop安装提示cls_image::gd_version() 和不支持JPEG

    ecshop版本:ECShop_V2.7.3_UTF8_release1106php 版本 5.5--------------------------------------------------- ...