加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

措施员从宏观、微观角度浅析JVM假造机!

发布时间:2019-03-19 21:41:20 所属栏目:站长百科 来源:架构月亮姨
导读:1.题目 JAVA文本文件怎样被翻译成CLASS二进制文件? 怎样领略CLASS文件的构成布局? 假造机怎样加载行使类文件的生命周期? 假造机系列诊断器材怎样行使? 假造机内存裁减机制? 假造机指令集架构? 2.要害词 编译,魔数,常量池,字面量,数据表,仓库,要领区
副问题[/!--empirenews.page--]

 1.题目

  1. JAVA文本文件怎样被翻译成CLASS二进制文件?
  2. 怎样领略CLASS文件的构成布局?
  3. 假造机怎样加载行使类文件的生命周期?
  4. 假造机系列诊断器材怎样行使?
  5. 假造机内存裁减机制?
  6. 假造机指令集架构?
  7. 措施员从宏观、微观角度浅析JVM假造机!

2.要害词

编译,魔数,常量池,字面量,数据表,仓库,要领区,措施计数器,内存引用,内存溢出,垃圾接纳器,新生区,永世区,指令集

3.全文提纲

本文将从宏观及微观角度来先容类文件布局、假造机加载类文件机制,类文件生命周期及字节码加载引擎,越发立体的加深对假造机事变的熟悉。

4.CLASS文件布局说明

从我们进修JAVA说话的第一天起,就执行过JAVA/JAVAC呼吁。JAVAC就是把我们写好的后缀为.java的文本文件编译成后缀为.class的字节码文件。上一章我们先容代码本质的时辰就相识到JAVA说话的语法元素。java文件我们可以通过文本编辑器打开,内里也是我们认识的java代码,切合了java说话的语礼貌范。可是对付class内里的内容,我们要生疏许多。上一章我们知道代码通过编译器翻译成呆板指令,那class文件会不会也是java假造机翻译成的指令呢?

着实当java文件被编译成class文件后,就跟java说话没什么相关了。指令执行引擎是JVM假造机,其他编程说话,好比Scala,Python等都可以编译成class文件,然后放到JVM来执行。这么说来,我们越发有须要探讨class文件的本质了。

4.1 CLASS文件示例

我们先从微观的角度来先容class文件的布局。先写一个简朴的java文本文件,然后编译成class文件,来调查class的布局构成。

先界说一个接口文件,Add.java文件如下:

  1. package com.lzh.jvm; 
  2. public interface Add{ 
  3.  int add(int i,int j); 
  4. 再写一个接口的实现类AddImpl.java,这个根基包括我们一般常常行使的文件布局: 
  5. package com.lzh.jvm; 
  6. public class AddImpl implements Add{ 
  7.  public static final int TOP = 100; 
  8.  private String point; 
  9.  public int add(int i,int j){ 
  10.  return i + j; 
  11.  } 

因为存在包名界说我们必要建好com/lzh/jvm的文件目次,然后在当前目次先后编译com/lzh/jvm/Add.java文件和com/lzh/jvm/AddImpl.java文件。获得了Add.class文件和AddImpl.class文件。

Add.java二进制文件:

Add.class二进制文件:

AddImpl.java二进制文件:

AddImpl.class二进制文件:

以上四个图是用WinHex二进制编辑器材打开的,左边是文件的二进制编码,右边是ASCII尺度编码,以是只能暗示英式键盘上的字符,呈现中文的话则表现乱码。为了阅读利便,器材展示的是16进制的名目,两个16进制的编码暗示一个字节空间(8位)。

直观上我们可以看出来java文件占用的存储空间比class要少许多,这也切合我们上一章先容的代码翻译进程。本质上计较机并不熟悉java文件内里的内容,java属于高级说话,内里的语法更为靠近人类的说话,可是对付计较机来说全难以领略。以是必要把java文件的内容翻译成jvm熟悉的文件名目。

高级说话高度抽象了说话元素,翻译为呆板指令则要耗费更多的“口舌”来指导计较机一步步执行代码语句。下一节我们来表明class文件的布局,从而领略jvm怎样领略执行class的内容。

4.2 class文件布局声名

本节我们将以上图给的AddImpl.class为例子来先容类的布局。从布局上来看,class文件只存放两种范例数据,别离为基本字段和表。

  • 基本字段:用于描写数字,引用,数值或字符串的无标记数,范例为u1,u2,u4,u8暗示占用字节数
  • 表:只有一行的可变列数的表布局,每个字段可所以基本字段或其他表的索引

4.2.1 魔数

用于判定文件范例,凡是我们以文件后缀来鉴别文件范例,可是假如修改后缀就会导致安详题目。class以4个字节的空间作为初步,来标明class的范例,CA FE BA BE暗示class范例的文件。

4.2.2 版本数

魔数后头紧接着4个字节暗示jdk版本号。

  • 次版本号:前两个字段0x0000
  • 主版本号:后两个字段0x0035,转换十进制为53,对应jdk1.9

4.2.3 常量池

常量池顾名思义是用于存放字符串常量,字符串常量包括:

  • 字面量:字符串,常量
  • 引用切合:类/接口全限命名,字段/要领名称和修饰符

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读