2019独角兽企业重金招聘Python工程师标准>>>

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

转载于:https://my.oschina.net/goodtemper/blog/227177

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

  1. java面试中jvm执行子系统详细分析(三)

    什么是jvm? JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的 ...

  2. jvm学习笔记-chapter6 类文件结构

    class类文件结构 数据及结构 是一组以8位字节为基础单位的二进制流.当遇到占有8位字节以上空间的数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储 采用一种类似于C语言结构体的伪结构来存 ...

  3. class 类文件结构与字节码指令

    JVM执行子系统 一.Class 类文件结构 1.Java跨平台的基础 各种不同平台的虚拟机与所有平台都统一使用的程序存储格式--字节码(ByteCode)是构成平台无关性的基石,也是语言无关性的基础 ...

  4. Java 虚拟机执行子系统

    JVM执行子系统的作用 在当前的Java中,编译器将源代码转成字节码后,字节码通过JVM的字节码执行引擎被执行,执行引擎负责具体的代码调用及执行过程.主要通过输入字节码文件,解析输入字节码,最后输出执 ...

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

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

  6. JVM——虚拟机执行子系统

    摘要 本文将深入的学习与分析JVM虚拟机的原理和相关的调优的相关实例. 虚拟机执行子系统 代码编译的结果从本地机器码转变为字节码, 是存储格式发展的一小步, 却是编程语言发展的一大步.记得在第一节计算 ...

  7. 【Java书笔记】:《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》第2部分-自动内存管理,第3部分-虚拟机执行子系统,第5部分-高效并发

    作者:周志明 整理者GitHub:https://github.com/starjuly/UnderstandingTheJVM 第2部分-自动内存管理 第2章 Java内存区域与内存溢出异常 2.2 ...

  8. JAVA类加载对字节码的处理_深入理解Java虚拟机(类文件结构+类加载机制+字节码执行引擎)...

    [本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 周志明的< ...

  9. 深入理解JVM虚拟机(四):Class类文件结构(一)

    我们都知道Java中的class文件是经过Java编译器对Java类文件进行编译后的产物.我想有不在少数的C程序员在学习Java之后在认知上会粗略的认为C程序在经过编译后产生的.out文件与.clas ...

  10. jvm(6)-java类文件结构(字节码文件)

    [0]README 0.1)本文部分文字描述转自 "深入理解jvm",旨在学习类文件结构  的基础知识: 0.2)本文荔枝以及荔枝的分析均为原创: 0.3)下面的截图中有附注t*编 ...

最新文章

  1. SAP RETAIL WA01创建分配表报错- No allocation rule allowed for allocation strategies or variants-
  2. Node.js链式回调
  3. Jsoup代码解读之四-parser(上)
  4. java打印数组_Java中打印数组内容的方式有哪些?
  5. 运用tp5上传图片,并生成缩略图
  6. 线性表的顺序表示和实现(严蔚敏版)
  7. SpringMVC HandlerMethodReturnValueHandler扩展
  8. 获取mysqli函数的值和字段名
  9. 拓端tecdat|R语言中的copula GARCH模型拟合时间序列并模拟分析
  10. python爬虫:爬取携程航班数据
  11. c++ 字符串替换指定字符
  12. Java修改文件MD5值-yellowcong
  13. 解决GitHub中releases下载过慢甚至失败的问题
  14. VC++计算正反坐标方向角
  15. spring 的 applicationcontext.xml
  16. 网络学习(第十八篇-HSRP协议讲解以及配置思路)
  17. springmvc考研交流平台 java ssm mysql
  18. iPhone4 iOS 5.1.1 越狱之后必装的插件
  19. MySQL高级篇知识点——其它数据库日志
  20. 多尺度量子谐振子优化算法(MQHOA)-matlab实现demo

热门文章

  1. No package ‘polkit-gobject-1‘ found
  2. LINUX虚拟机与WINDOWS主机,直接复制交换文件会有问题
  3. 编程基本功:顾名思义是可视化编程的要求
  4. JAVA转为wasm/JavaScript,可以考虑CheerpJ
  5. JAVA中,目录C:\\TEMP等效于C:\TEMP
  6. 灵异事件很多,却没有平行宇宙
  7. 别人改汝代码,应该怎么办
  8. 公司设备损坏了,怎么处理
  9. 解决办法:对‘operator delete(void*)’未定义的引用
  10. 无恶意的协议才有效力