目录
1.虚拟机与Java虚拟机
Jvm 字节码 :java语言编译成的字节码
Java语言虚拟机 à 多语言虚拟机
Java hotspot virtual machine --->java 的默认虚拟机
Jvm 跨语言的平台 scala 、groovy、clojure
2006 java开源并建立了OpenJDK Hotspot虚拟机也成为OpenJDK中的默认虚拟机。
2011 jdk1.7u4 正式期用新的垃圾回收器G1
2017 jdk9发布 将G1设置为默认GC,替代CMS
2018 jdk11 发布 发布了革命性的ZGC
虚拟机:就是一台虚拟的计算机它是一款软件,用来执行一系列虚拟计算机指令。
大体上分为系统虚拟机(完全对物理虚拟机的仿真,提供一个可运行完整操作系统的软件平台 –Virtual Box、VMware)+程序虚拟机(典型代表java虚拟机,专门为执行单个计算机程序而设计,在Java虚拟机中执行的指令成为Java字节码指令)
无论是系统虚拟机还是程序虚拟机,在上面运行的软件按都被限制于虚拟机提供的资源中。
Java虚拟机
Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成。
JVM平台的各种语言可以共享Java虚拟机带来的跨平台性、优秀的垃圾回器,以及可靠的即时编译器。
Java技术的核心就是Java虚拟机(JVM,Java Virtual Machine),因为所有的Java程序都运行在Java虚拟机内部。
·作用:
Java虚拟机就是二进制字节码运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条Java指令,Java虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里。
·特点:
一次编译,到处运行
自动内存管理
自动垃圾回收功能
2.JVM的位置
3.JVM的整体结构
HotSpot VM是目前市面上高性能虚拟机的代表作之一。它采用解释器与即时编译器并存的架构。在今天,Java程序的运行性能早已脱胎换骨,已经达到了可以和C/C++程序一较高下的地步。
执行引擎:解释器、JIT即时编译器、垃圾回收器
4.Java代码执行流程
5.区分栈的指令集和寄存器指令集架构
Java编译器输入的指令流基本上是一基于栈的指令集架构,另外一种指令集架构则是基于寄存器的指令集架构。
具体来说:这两种架构之间的区别:
·基于栈式架构的特点
>设计和实现更简单,适用于资源受限的系统;
>避开了寄存器的分配难题:使用零地址指令方式分配。
>指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。指令集更小,编译器容易实现。(指令集更小,指令多)
>不需要硬件支持,可移植性更好,更好实现跨平台
·基于寄存器架构的特点
>典型的应用是x86的二进制指令集:比如传统的PC以及Android的Dav1ik虚拟机。
>指令集架构则完全依赖硬件,可移植性差
>性能优秀和执行更高效;
>花费更少的指令去完成一项操作。
>在大部分情况下,基于寄存器架构的指令集往往都以一地址指令、二地址指令和三地址指令为主,而基于栈式架构的指令集却是以零地址指令为主。
总结:
由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。
时至今日,尽管嵌入式平台已经不是Java程序的主流运行平台了(准确来说应该是HotSpotVM的宿主环境已经不局限于嵌入式平台了),那么为什么不将架构更换为基于寄存器的架构呢
栈:跨平台性、指令集小、指令多;执行性能比寄存器差
6.JVM的生命周期
虚拟机的启动
Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initialclass)来完成的,这个类是由虚拟机的具体实现指定的。
虚拟机的执行
一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序。
程序开始执行时他才运行,程序结束时他就停止。
执行一个所谓的Java程序的时候,真真正正在执行的是一个叫做Java虚拟机的进程。
虚拟机的退出
有如下的几种情况:
---程序正常执行结束
---程序在执行过程中遇到了异常或错误而异常终止
---由于操作系统出现错误而导致Java虚拟机进程终止
---某线程调用Runtime类或System类的exit方法,或Runtime类的halt方法,并且Java安全管理器也允许这次exit或halt操作。
---除此之外,JNI(Java Native Interface)规范描述了用JNI Invocation API来加载或卸载 Java虚拟机时,Java虚拟机的退出情况。
注:
为什么会有java和javac呢,java语言比较特殊,由java语言编写的程序需要经过编译步骤,但是这个编译步骤并不会生产特定平台的机器码,而是生产一种与平台无关的字节码(也就是.class文件)。当然这种字节码不是可执行的,必须使用java解释器来执行。因此可以认为java语言即使编译型也是解释型语言。java执行的过程必须经过先编辑,后解释的两个步骤。
java语言里负责解释执行字节码文件的是java虚拟机,即JVM。JVM是运行java字节码文件的虚拟计算机。所有平台的JVM向编译器提供相同的接口,而编译器只需要面向虚拟机,生产虚拟机能理解的代码,然后由虚拟机来解释。我们仅仅需要在不同的操作系统中安装不同的JVM,就可以将编写一次代码生产的class文件,在不同的操作系统中进行执行了。这是java程序的跨平台型。