详解Java虚拟机概述
1.Java虚拟机概述
Oracle官方定义的Java技术体系主要包括以下几个部分:
Java程序设计语言
各种平台的Java虚拟机
Class文件格式
Java API类库
第三方Java类库
可以把Java程序设计语言、Java虚拟机和Java API类库这三部分统称为JDK(Java Development Kit),它是Java程序开发的最小环境。另外,Java API中的Java SE API子集和Java虚拟机这两部分统称为JRE(Java Runtime Environment),它是Java程序运行的标准环境。
Java虚拟机之所以被称为是“虚拟”的,就是因为它仅仅是由一个规范来定义的抽象计算机.
2. Java虚拟机家族
很多同学可能认为Java虚拟机,就是一个虚拟机而已,它还有家族?或者认为Java虚拟机指的就是Oracle的HotSpot虚拟机。这里来简单介绍Java虚拟机家族,自从1996年Sun公司发布的JDK1.0中包含的Sun Classic VM到今天,出现和消亡了很多种虚拟机,我们这里只简单介绍目前存活的相对主流Java虚拟机。
HotSpot VM
Oracle JDK和OpenJDK中自带的虚拟机,是最主流的和使用范围最广的Java虚拟机。介绍Java虚拟机的技术文章,如果不做特殊说明,大部分都是介绍HotSpot VM的。HotSpot VM并非是Sun公司开发的,而是由Longview Technologies这家小公司设计的,它在1997年被Sun公司收购,Sun公司又在2009年被Oracle收购。
J9 VM
J9 VM 是IBM开发的VM,目前是其主力发展的Java虚拟机。J9 VM的市场定位和HotSpot VM接近,它是一款设计上从服务端到桌面应用再到嵌入式都考虑到的多用途虚拟机,目前J9 VM的性能水平大致跟HotSpot VM是一个档次的。
Zing VM
以Oracle的HotSpot VM为基础,改进了许多会影响延迟的细节。最大的三个卖点是:
1.低延迟,“无暂停”的C4 GC,GC带来的暂停可以控制在10ms以下的级别,支持的Java堆大小可以到1TB;
2.启动后快速预热功能。
3.可管理性:零开销、可在生产环境全时开启的、整合在JVM内的监控工具Zing Vision。
3. Java虚拟机执行流程
当我们执行一个Java程序时,它的执行流程是怎样的呢?如下图所示。
从上图可以看到Java虚拟机与java语言没有什么必然联系,它只与特定的二进制文件:Class文件有关。
4.Java虚拟机结构
这里所讲的体系结构,是指的Java虚拟机的抽象行为,而不是具体的比如HotSpot VM的实现。按照Java虚拟机规范,抽象的Java虚拟机如下图所示。
JVM = 类加载器 classloader + 执行引擎 execution engine + 运行时数据区域 runtime data area。classloader 把硬盘上的class 文件加载到JVM中的运行时数据区域, 但是它不负责这个类文件能否执行,而这个是 执行引擎 负责的。
Java虚拟机抽象规范仅仅是个概念,一般所说的Java虚拟机都是该规范的具体实现,这个实现可能 来自多个提供商,并存在于多个平台上。它可以完全用软件实现,或者以硬件和软件相结合的方式来实现。
5. 虚拟机的生命周期
一个运行时的Java虚拟机实例的天职是:负责运行一个java程序。当启动一个Java程序时,一个虚拟机实例也就诞生了。当该程序关闭退出,这个虚拟机实例也就随之消亡。如果同一台计算机上同时运行三个Java程序,将得到三个Java虚拟机实例。每个Java程序都运行于它自己的Java虚拟机实例中。
Java虚拟机实例通过调用某个初始类的main()方法来运行一个Java程序。而这个main()方法必须是共有的(public)、静态的(static)、返回值为void,并且接受一个字符串数组作为参数。任何拥有这样一个main()方法的类都可以作为Java程序运行的起点。
public class Test {public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println("Hello World"); } }
在上面的例子中,Java程序初始类中的main()方法,将作为该程序初始线程的起点,任何其他的线程都是由这个初始线程启动的。
在Java虚拟机内部有两种线程:守护线程和非守护线程。守护线程通常是由虚拟机自己使用的,比如执行垃圾收集任务的线程。但是,Java程序也可以把它创建的任何线程标记为守护线程。而Java程序中的初始线程——就是开始于main()的那个,是非守护线程。
只要还有任何非守护线程在运行,那么这个Java程序也在继续运行。当该程序中所有的非守护线程都终止时,虚拟机实例将自动退出。假若安全管理器允许,程序本身也能够通过调用Runtime类或者System类的exit()方法来退出。
以上就是详解Java虚拟机概述的详细内容,更多请关注其它相关文章!