文档章节

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

oO脾气不坏Oo
 oO脾气不坏Oo
发布于 2014/04/27 02:47
字数 1297
阅读 114
收藏 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进阶
06/22
0
0
Java虚拟机基础——1Java的内存模型

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

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

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

LYQ1990
07/18
0
0
一个“Hello World”理解JVM运行时数据区

先上一张JVM体系结构图: 1)运行时数据区:经过编译生成的字节码文件(class文件),由class loader(类加载子系统)加载后交给执行引擎执行。在执行引擎执行的过程中产生的数据会存储在一块内...

ntchan
07/12
0
0
Android JNI(一)——NDK与JNI基础

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法...

隔壁老李头
05/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

线性一致性和 Raft

作者:沈泰宁 在讨论分布式系统时,共识算法(Consensus algorithm)和一致性(Consistency)通常是讨论热点,两者的联系很微妙,很容易搞混。一些常见的误解:使用了 Raft [0] 或者 paxos ...

TiDB
11分钟前
0
0
兄弟连区块链教程以太坊源码分析core-state-process源码分析

## StateTransition状态转换模型 /* The State Transitioning Model 状态转换模型 A state transition is a change made when a transaction is applied to the cu......

兄弟连区块链入门教程
13分钟前
0
0
linear-gradient渐变中的参数

在看张鑫旭的博客 遇到渐变数值后面带参数不太理解 @supports (-webkit-mask: none) or (mask: none) { .box { border: none; background: linear-gradient(to bottom, #34538...

红羊在厦门
14分钟前
0
0
Python yagmail模块自动发邮件

Python发邮件yagmail模块 import yagmail#连接服务器yag=yagmail.SMTP('xx@163.com','yy','smtp.163.com')#邮箱正文contents=["test","email send"]#发送邮件#yag.send('...

小白兔_球球
15分钟前
1
0
pada mysql

CREATE SCHEMA `exchange` DEFAULT CHARACTER SET utf8mb4 ;

qwfys
24分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部