文档章节

JVM执行子系统探究——类文件结构初窥

oO脾气不坏Oo
 oO脾气不坏Oo
发布于 2014/04/27 02:47
字数 1297
阅读 117
收藏 11

    类文件(.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文件有个了解,下一次将详细介绍各部分内容。


© 著作权归作者所有

oO脾气不坏Oo
粉丝 72
博文 55
码字总数 67574
作品 0
深圳
程序员
私信 提问
深入理解Java虚拟机的体系结构

JAVA虚拟机的生命周期 一个运行时的Java虚拟机实例的天职是:负责运行一个java程序。当启动一个Java程序时,一个虚拟机实例也就诞生了。当该程序关闭退出,这个虚拟机实例也就随之消亡。如果...

java进阶
2018/06/22
0
0
Java虚拟机基础——1Java的内存模型

最近和几个之前一起做安卓的朋友喝酒,他最近在研究JVM,我们就简单的讨论了起来,他比我研究的深很多,我也不甘堕落,自己也开始研究了一下,写了4篇文章整理了一下自己的思路,Java虚拟机整...

隔壁老李头
2018/10/03
0
0
Java虚拟机JVM内部体系结构

Java虚拟机JVM内部体系结构 易百教程移动端:请扫描本页面底部(右侧)二维码并关注微信公众号,回复:"教程" 选择相关教程阅读或直接访问:http://m.yiibai.com 。 JVM(Java虚拟机)是一个抽象...

LYQ1990
2018/07/18
224
0
本地方法怎么映射Java层的数据类型

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangyangzhizhou/article/details/79576578 前言 Java 语言上定义了不同的数据类型,比如有基础类型、等等,还...

超人汪小建(seaboat)
2018/03/16
0
0
在.NET平台上使用Scala语言(上):初尝

Scala是Java平台上的一门新兴起的语言,我也不止一次在博客上提到它。我非常希望它可以取代Java这种劣质语言,让Java平台的生产力上一个台阶。事实上,Scala从一开始——或者说“很早”就对生...

mj4738
2011/11/01
155
0

没有更多内容

加载失败,请刷新页面

加载更多

只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生。 比较通用的返回值格式如下:...

晓月寒丶
昨天
59
0
区块链应用到供应链上的好处和实际案例

区块链可以解决供应链中的很多问题,例如记录以及追踪产品。那么使用区块链应用到各产品供应链上到底有什么好处?猎头悬赏平台解优人才网小编给大家做个简单的分享: 使用区块链的最突出的优...

猎头悬赏平台
昨天
28
0
全世界到底有多少软件开发人员?

埃文斯数据公司(Evans Data Corporation) 2019 最新的统计数据(原文)显示,2018 年全球共有 2300 万软件开发人员,预计到 2019 年底这个数字将达到 2640万,到 2023 年达到 2770万。 而来自...

红薯
昨天
65
0
Go 语言基础—— 通道(channel)

通过通信来共享内存(Java是通过共享内存来通信的) 定义 func service() string {time.Sleep(time.Millisecond * 50)return "Done"}func AsyncService() chan string {retCh := mak......

刘一草
昨天
58
0
Apache Flink 零基础入门(一):基础概念解析

Apache Flink 的定义、架构及原理 Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态或无状态的计算,能够部署在各种集群环境,对各种规模大小的数据进行快速...

Vincent-Duan
昨天
60
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部