java虚拟机被设计来支持java语言,oracle版本的jdk包含一个用java语言实现的编译源代码的编译器和一套JVM指令集,一个实现了jvm的运行时系统。理解一个编译器如何优化jvm对于编译器作者和对于想理解jvm的人来说都是很有作用的。
记住编译器这个词有时会被用来表示是从jvm的指令集到CPU的指令集的翻译器。这样的一个例子比如JIT代码产生器。
1。 例子的格式
这篇文章包含源代码和有注释的jvm代码,这些jvm代码由oracle jdk1.0.2的javac编译器产生。jvm代码由非正式的虚拟汇编语言所写,由oracle的javap命令产生输出。你可以用javap命令去产生编译方法的额外的例子。
例子的格式对于熟悉汇编预言帝呃人来说是很熟悉的。每个指令的格式大概是:
<index><opcode>[<operand>[<operand2>...]][<comment>]
<index>是操作码指令的索引在包含jvm代码字节的数组中,同样的,<index>也被认为是从方法开始字节的偏移,<opcode>是指令的操作码部分,一个操作码可以跟随0个或多个操作数,在末尾有可选的注释部分。
8 bipush 100 //常量100入栈
有些注释部分是javap命令产生的,其他部分是代码的作者写的。每天指令前面的<index>索引也许被用来作为控制转移指令的目标。例如,一条goto 8指令转移控制到在索引8位置处的索引。记住jvm控制转移指令的实际操作数是从这些指令操作码的地址开始的偏移,这些操作数通过javap命令进行展示。
在带“#”开始的索引表示常量池的索引, 例: 10 ldc #1
2.常量池,局部变量去和控制构造的用法
jvm代码展示了一套由java虚拟机设计和用到的类型的普通字符。
spin()方法仅仅进行了100次循环:
void spin() {
int i;
for (i = 0; i < 100; i++)
{ ; //l循环体内是空的 }
}
这段代码会编译为:
0 iconst_0 //常量0 进入操作数栈
1 istore_1 //把操作数栈中栈顶的常量存入局部变量去1的位置
2 goto 9
5 iinc 1 1 //局部变量区索引为1的局部变量加1
8 iload_1 //把局部变量区索引为1位置的整数load到操作数栈中
9 bipush 100 //常量100进入操作数栈
11 if_icmplt 5 //比较和循环
14 return //返回
jvm中的大部分操作都是以栈为中心的,对于大部分从当前栈帧中取得一个或多个操作数的操作和把计算结果存入存入操作数栈。
每当一个方法被调用线程就会创建一个栈帧,包含了操作数栈和局部变量区。在程序运行的过程中,有可能有许多栈帧,同时每个线程控制了许多操作数栈。只有当前栈帧的操作数栈是活动的。
JVM指令集区别操作数的类型通过在不同的数据类型上用不同的字节码。spin()方法只在int类型上进行操作,因此该方法产生的字节码都指到了int。
spin()方法中的两个常量0和100被放入操作数栈用不同的指令。0用的是iconst_0指令,100用的是bipush指令。
分享到:
相关推荐
java虚拟机规范,高清PDF版本,含有目录结构:第一章:引言; 第二章:java虚拟结构(运行时区域内存:寄存器,java虚拟机栈,java... 第三章:为java虚拟机编译; 第四章:Class文件格式; 第五章:加载、链接与初始化
第3章详述如何将Java语言编写的程序转换为Java虚拟机指令集,涉及常量、局 部变量、控制结构、算术运算、参数接收、方法调用、数组、操作数栈、异常处理、同步与注解等;第4章深入分析用来表示编译后的类和接口的...
第1章 :简单地介绍了Java虚拟机的历史并吹捧了←_← 一下Java的平台无关性(一次编译,到处运行); 第2章:概览Java虚拟机整体架构; 第3章:介绍如何将Java语言编写的程序转换为虚拟机指令集; 第4章:定义...
Sun公司的Java虚拟机规范中文版 第一章 引言 第二章 JAVA的概念 第三章 JAVA虚拟机的结构 第四章 Class文件格式 第五章 常数池解析 第六章 JAVA虚拟机指令集 第七章 为JAVA虚拟机编译
Java源代码被编译成字节码,这是一种中间表示形式,可以被任何Java虚拟机理解和执行。字节码的这种设计使得Java程序能够在不同的平台上运行,无需重新编译。字节码文件格式定义了.class文件的结构,包括魔数、版本...
在性能优化方面,Java虚拟机实现了诸如垃圾收集(Garbage Collection)、动态编译(Just-In-Time, JIT)等机制。垃圾收集自动管理内存,避免程序员手动处理内存泄露问题;JIT编译则是在运行过程中将频繁执行的热点...
Java虚拟机规范中文版(电子书) 目录 第一章.引言 第二章.JAVA概念 第三章.JAVA虚拟机的结构 第四章.class文件格式 第五章....为JAVA虚拟机编译 第八章.线程和锁 第九章.优化 第十章.操作码的操作码助记符
Java虚拟机(JVM)是实现Java技术的关键组件,它为Java程序提供了一个运行环境。Java程序在编写后会被编译成一种称为字节码的中间表示形式,这种字节码可以跨平台运行,因为JVM负责将字节码转换成机器代码。JVM的...
在Windows环境下编译Avian Java虚拟机是一项技术性较强的任务,涉及到多个步骤和知识点。Avian是一款轻量级、开源的Java虚拟机,它旨在提供一个小型、快速且可移植的JVM实现,适用于嵌入式设备和资源有限的环境。...
Java虚拟机(JVM,Java Virtual Machine)是Java平台的核心组成部分,它负责执行Java程序,为Java代码提供了跨平台的运行环境。Java虚拟机的概念始于Sun Microsystems,现在由Oracle公司继续发展和维护。JVM的设计...
第3章详述如何将Java语言编写的程序转换为Java虚拟机指令集,涉及常量、局部变量、控制结构、算术运算、参数接收、方法调用、数组、操作数栈、异常处理、同步与注解等;第4章深入分析用来表示编译后的类和接口的...
Java虚拟机(JVM)是Java编程语言的核心组成部分,它为Java程序提供了跨平台的运行环境。Java程序在编写完成后,会被编译成字节码(.class文件),这些字节码可以在任何装有JVM的系统上运行,实现了“一次编写,到处...
《深入Java虚拟机(原书第2版)》,原书名《Inside the Java Virtual Machine,Second Edition》,作者:【美】Bill Venners,翻译:曹晓钢、蒋靖,出版社:机械工业出版社,ISBN:7111128052,出版日期:2003 年 9 ...
第3章详述如何将Java语言编写的程序转换为Java虚拟机指令集,涉及常量、局部变量、控制结构、算术运算、参数接收、方法调用、数组、操作数栈异常处理、同步与注解等。第4章深入分析了用来表示编译后的类和接口的...
微软版本的Java虚拟机是专为Windows操作系统设计的,使得在Windows系统上可以执行编译后的Java字节码(.class文件)。这个压缩包“java虚拟机(微软版本) - java 虚拟机,微软版本,适合操作系统-windows.rar”包含了...
Java虚拟机(JVM)是Java程序运行的基础,它提供了执行环境和各种内存区域,以支持Java代码的高效运行。本地方法栈是JVM的一部分,它主要负责处理与本地方法(通常是由C或C++编写)相关的调用。本地方法栈在Java线程...