脚本宝典收集整理的这篇文章主要介绍了二、JVM从入门到精通之虚拟机详解,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
所谓虚拟机(Virtual Machine),就是一台虚拟计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。
无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制与虚拟机提供的资源中。
作用F1a;
Java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条Java指令,java虚拟机规范中都有详细的定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里。
特点:
红色框:方法区和堆是多线程共享的,涉及线程安全问题 灰色框:Java栈、本地方法栈、程序计数器是线程私有的,不会设计到线程安全 执行引擎:因为计算机系统不识别字节码指令,所以要由执行引擎将字节码指令翻译为机器指令
Java编译器输入的指令流基木上是一种基于栈的指令集架构,另外一种指令集架构则是基于寄存器的指令集架构。 具体来说:这两种架构之间的区别:·
基于栈式架构的特点
基于寄存器架构的特点
从上图可以看到,因为对一个简单的加法进行操作时,会有很多的入栈出栈的操作,每一个操作都需要一个指令去完成,所以栈式架构需要的指令更多,而寄存器架构只需要将两个参数的位置记录,使用的时候直接取出哪来用,避免了很多不需要的操作,所以性能会更好。举个例子,为什么说寄存器架构的指令少性能更加优秀?
既然寄存器架构的性能比较好为什么JVM不使用呢?
由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,寄存器又比较依赖于硬件,平台受限,所以不能设计为基于寄存器的。栈架构的优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。
Java虚拟机的启动是通过引导类加载器(Bootstrap class loader)创建一个初始类(inITial class)来完成的,这个类是由虚拟机的具体实现指定的。
我们下面写一个测试类,来观察jvm的执行过程
package com.jvmtest;
public class StackStruTest {
public static void main(String[] args) {
int i=2;
int j=3;
int z=i+j;
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.PRintStackTrace();
}finally {
System.out.println("jvm退出");
}
}
}
运行main()方法后,点击下面的terminal选项 输入jps命令 观察,当程序执行完后,再次输入jps,对比下,可以看到
34748 StackStruTest
消失了 程序已经执行完后退出了,也就是JVM此时也正常退出了。
有如下的几种情况:·
问题:解释器与JIT编译器的区别
JIT编译器,英文写作Just-in-time Compiler,中文意思是即时编译器。 JIT是一种提高程序运行效率的方法。通常,程序有两种运行方式:静态编译与动态解释。静态编译的程序在执行前全部被翻译为机器码,而动态解释执行的则是一句一句边运行边翻译。
就以java为例。在jdk 1.0时代,java虚拟完全是解释执行的。那什么是解释执行呢?解释器(你可以理解为翻译器)每次读一代码,就将字节码起转换(翻译)为JVM可执行的指令,一直到最后,说白了边听边译。这样的结果显易见,效率低下,更重要的是同样的代码每次都需要重新翻译。这怎么能忍,必须要解决啊。随着后面的发展,现在大多数的主流的JVM都包含即时编译器。那什么是即时编译器呢?所谓的即时编译器说白了就是将源代码直接生成符合本地物理机可识别的机器语言。还是拿java举例呗,JVM在运行期间会根据代码热度来选择是否代码转换为本地机器语言。当然,这个代码热度的判断相对复杂,不仅仅是某个方法调用的次数达到指定阀值,不同的场景有不同的策略,具体就不说了。即时编译器的好处在于可以对代码进行深度优化,同时提高效率(只编译了一次,以后每次都会调用执行的速度大大提高),现在大部分的虚拟机都是解释器和即时编译器共同存在的
下面还有很多的虚拟机,我们就不一 一的挑出来说明了…
下个章节 我们将对JVM内部的各个模块做详细的剖析说明
💥推荐阅读💥
上一篇:一、JVM从入门到精通之你曾被JVM伤害过吗?
以上是脚本宝典为你收集整理的二、JVM从入门到精通之虚拟机详解全部内容,希望文章能够帮你解决二、JVM从入门到精通之虚拟机详解所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。