措施员从宏观、微观角度浅析JVM假造机!
副问题[/!--empirenews.page--]
1.题目
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文件如下:
因为存在包名界说我们必要建好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文件只存放两种范例数据,别离为基本字段和表。
4.2.1 魔数 用于判定文件范例,凡是我们以文件后缀来鉴别文件范例,可是假如修改后缀就会导致安详题目。class以4个字节的空间作为初步,来标明class的范例,CA FE BA BE暗示class范例的文件。 4.2.2 版本数 魔数后头紧接着4个字节暗示jdk版本号。
4.2.3 常量池 常量池顾名思义是用于存放字符串常量,字符串常量包括:
(编辑:河北网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |