Java 代码是怎么运行的
1.Java代码有很多 不同的运行方式
1)可以在开发工具中运行
2)可以双击执行jar文件运行,
3)也可以在命令行中运行
4)甚至可以在网页中运行
这些执行方式都离不开JRE ,也就是Java的运行环境。JRE仅包含运行Java程序的必须组件,包括Java虚拟机以及Java核心类库。Java程序员经常接触到的JDK同样包含JRE,并且还附带了一些开发、诊断工具
2.为什么Java要在虚拟机里运行
Java作为一门高级程序语言,他的语法非常复杂,抽象程度也很高。直接在硬件上运行这种复杂的程序并不现实。所以在运行Java程序之前,我们需要进行一番转化。
这个转化具体是怎么操作的呢?
当前的主流思想,就是设计一个面向Java语言特性的虚拟机,并通过编译器将Java程序转换成哎虚拟机所能识别的指令序列,也称为Java字节码。(Java字节码指令的操作码opcode被固定为一个字节)。
Java =写的helloword程序编译而成 的字节码。都是一个个字节组成的
# 最左列是偏移;中间列是给虚拟机读的机器码;最右列是给人读的代码 0x00: b2 00 02 getstatic java.lang.System.out 0x03: 12 03 ldc "Hello, World!" 0x05: b6 00 04 invokevirtual java.io.PrintStream.println 0x08: b1 return
Java 虚拟机可以由硬件实现 [1],但更为常见的是在各个现有平台(如windows、liunx)上提供软件实现。这样做的意义就是,一旦一个程序被转换成Java 字节码,那么他便可以在不同平台上的虚拟机实现运行。(一次编写,到处运行)。
虚拟机的另外一个好处是他带来了一个托管环境(Managed Runtime)。他能够代替我们处理一些代码中的冗长而容易出错的部分。其中最广为人知的内存管理和垃圾回收。除此之外还提供了数组越界、动态类型、安全权限等动态检测,是我们免于书写这些无关业务逻辑的代码。
3.Java虚拟机具体是怎样运行Java字节码的
执行Java代码首先需要将他编译成class文件加载到Java虚拟机中。加载后的Java类会被存放于方法区(method area).实际运行时,虚拟机会执行方法区内的代码。Java虚拟机同样会在内存中划分出堆和栈来存储运行时数据。
在运行过程当中,每当调用一个Java方法,Java虚拟机会在当前线程的Java方法栈中生产一个栈帧。用于存放局部变量以及字节码的操作数。这个栈帧大小是提前计算好的,而且栈帧在内存空间里可以不是连续分布的。
当退出当前执行的方法时,不管是正常返回还是异常返回,虚拟机均会弹出当前线程的当前栈帧,并将之舍去。
Java字节码是无法执行的。因此,Java虚拟机需要将字节码翻译成机器码。在hotspot里面,有两种编译方式:第一种是解释执行,逐条将字节码翻译成机器码并执行;第二种是即时编译,讲一个方法中包含的所有字节码编译成机器码后执行。
前者的优势在于无需等待编译,而后者的优势在于实际运行速度更快。hotspot默认采用混合模式,综合了解执行和即使编译两者的优点。他先解释执行字节码,而后将其中反复执行的热点代码,以方法为单位进行即时编译。
4.Java虚拟机的运行效率究竟如何
HotSpot采用了多种技术来提升启动性能以及峰值性能,即时编译便是其中最终要的技术之一。即时编译建立在程序符合二八定律的假设上,也即是百分之二十的代码占据了百分之八十的计算机资源。
对于大部分的不常用的代码,我们无需耗费时间将其编译成机器码,而是采取解释执行的方式运行;另一方面对于仅占据小部分的带点代码,我们则可以将其编译成机器码,已达到理想的运行速度。
5.总结
之所以要在虚拟机中运行,是他提供了可移植性。一旦Java代码被编译成Java字节码,变可以在不同平台上运行,虚拟机还提供了一个代码托管环境,代替我们处理部分冗长的代而且容易出错的事务。
Java虚拟机将运行时内存区域划分为五个部分,分别为方法区、堆、pc寄存器、Java方法栈和本地方法栈。Java程序编译而成的calss文件,需要先加载至方法区中,Java虚拟机才能运行。
为了提高效率,标准jdk中的hotspot虚拟机采用的是一种混合执行的策略。他会解释执行Java字节码,然后会将其中反复执行的热点代码,以方法为单位进行即时编译,编译成机器码后直接运行在底层硬件之上。