JDK的组成
JDK
JDK:JDK是Java**工具包,是Sun Microsystems针对Java**员的产品。JDK中包含JRE(在JDK的安装目录下有一个名为jre的目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib合起来就称为jre)和一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。Java Runtime Environment(JRE):是运行基于Java语言编写的程序所不可缺少的运行**。也是通过它,Java的**者才得以将自己**的程序发布到用户手中,让用户使用。JRE中包含了Java virtual machine(JVM),runtime class libraries和Java application launcher,这些是运行Java程序的必要组件。JVM(java virtual machine):就是我们常说的java虚拟机,它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。JVM体系结构
JVM就是运行在操作系统之上的一个软件
JVM体系结构
JVM的组成:
类加载子系统 Class loader运行时数据区 JVM 内存模型执行引擎为什么 Java 要在虚拟机里运行
简单的来说,Java作为一门高级程序语言,语法复杂,抽象度高,直接在硬件上运行这种复杂的程序并不现实;所以JAVA的设计者就设计一个面向 Java 语言特性的虚拟机,并通过编译器将 Java 程序转换成该虚拟机所能识别的指令序列(Java 字节码)。Java字节码会被虚拟机翻译为可以被机器识别的机器码,这也实现了Java的跨平台(相同的代码可以在不同操作系统的JVM中运行)
虚拟机的第二个好处就是带来了一个托管**,托管**能够代替我们处理代码中冗余并且容易出错的部分,比如自动内存管理,垃圾回收、 还有诸如数组越界、动态类型、安全权限等等动态监测。
JVM是怎样运行 Java 字节码的
执行 Java 代码首先需要将它编译而成的 class 文件加载到 JVM虚拟机中。加载后的 Java 类会被存放于**区(Method Area)中。实际运行时,虚拟机会执行**区内的代码;Java 虚拟机会在内存中划分出堆和栈来存储运行时数据。JVM会将栈细分为面向 Java **的 Java **栈,面向本地**(用 C++ 写的 native **)的本地**栈,以及存放各个线程执行位置的 PC 寄存器。
JVM加载字节码
在运行过程中,每当进入一个 Java **,Java 虚拟机会在当前线程的 Java **栈中生成一个栈帧,用以存放局部变量以及字节码的操作数。这个栈帧的大小是提前计算好的,而且 Java 虚拟机不要求栈帧在内存空间里连续分布。当退出当前执行的**时,不管是正常返回还是异常返回,JVM均会弹出当前线程的当前栈帧,并将之舍弃。
当然Java 字节码是无法在硬件上直接执行的,所以JVM需要将字节码翻译成机器码。
在 HotSpot 里面,上述翻译过程有两种形式:第一种是解释执行,即逐条将字节码翻译成机器码并执行;第二种是即时编译(Just-In-Time compilation,JIT),即将一个**中包含的所有字节码编译成机器码后再执行。
JVM执行字节码
解释执行:无需等待编译,在运行的过程中,需要的时候编译然后执行即时编译:JVM先将字节码编译为机器码,然后在执行,所以在实际运行中速度更快。
HotSpot 默认采用混合**,综合了解释执行和即时编译两者的优点。它会先解释执行字节码,而后将其中反复执行的热点代码,以**为单位进行即时编译。