Java虚拟机(JVM)一种用于计算机设备的规范,可用不一样的方式(软件或硬件)加以实现。编译虚拟机的指令集与编译微处理器的指令集很是相似。html
Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。java
Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证通过编译的任何Java代码可以在该系统上运行。程序员
Java生命周期
- 启动。启动一个Java程序时,一个JVM实例就产生了,任何一个拥有public static void main(String[] args)函数的class均可以做为JVM实例运行的起点。
- 运行。main()做为该程序初始线程的起点,任何其余线程均由该线程启动。
- 消亡。当程序中的全部非守护线程都终止时,JVM才退出;若安全管理器容许,程序也可使用Runtime类或者System.exit()来退出。
一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序。程序开始执行时他才运行,程序结束时他就中止。你在同一台机器上运行三个程序,就会有三个运行中的Java虚拟机。 Java虚拟机老是开始于一个main()方法,这个方法必须是公有、返回void、直接受一个字符串数组。在程序执行时,你必须给Java虚拟机指明这个包换main()方法的类名。main()方法是程序的起点,他被执行的线程初始化为程序的初始线程。程序中其余的线程都由他来启动。面试
Java中的线程分为两种:守护线程 (daemon)和普通线程(non-daemon)。守护线程是Java虚拟机本身使用的线程,好比负责垃圾收集的线程就是一个守护线程。固然,也能够把本身的程序设置为守护线程。包含main()方法的初始线程不是守护线程。算法
JVM体系结构
1) 类装载器(ClassLoader)(用来装载.class文件)数组
2) 执行引擎(执行字节码,或者执行本地方法)安全
3) 运行时数据区(方法区、堆、java栈、PC寄存器、本地方法栈)jvm
Java虚拟机由五个部分组成:一组指令集、一组寄存器、一个栈、一个无用单元收集堆(Garbage-collected-heap)、一个方法区域。这五部分是Java虚拟机的逻辑成份,不依赖任何实现技术或组织方式,但它们的功能必须在真实机器上以某种方式实现。函数
1)Java虚拟机支持大约248个字节码。每一个字节码执行一种基本的CPU运算,例如,把一个整数加到寄存器,子程序转移等。Java指令集至关于Java程序的汇编语言。优化
Java指令集中的指令包含一个单字节的操做符,用于指定要执行的操做,还有0个或多个操做数,提供操做所需的参数或数据。许多指令没有操做数,仅由一个单字节的操做符构成。
2)Java虚拟机的寄存器用于保存机器的运行状态,与微处理器中的某些专用寄存器相似。Java虚拟机的寄存器有四种:
- pc:Java程序计数器。
- optop:指向操做数栈顶端的指针。
- frame:指向当前执行方法的执行环境的指针。
- vars:指向当前执行方法的局部变量区第一个变量的指针。
3)Java虚拟机的栈有三个区域:局部变量区、运行环境区、操做数区。
4)Java的堆是一个运行时数据区,类的实例(对象)从中分配空间。Java语言具备无用单元收集能力:它不给程序员显式释放对象的能力。Java不规定具体使用的无用单元收集算法,能够根据系统的需求使用各类各样的算法。
5)方法区与传统语言中的编译后代码或是Unix进程中的正文段相似。它保存方法代码(编译后的java代码)和符号表。在当前的Java实现中,方法代码不包括在无用单元收集堆中,但计划在未来的版本中实现。每一个类文件包含了一个Java类或一个Java界面的编译后的代码。能够说类文件是Java语言的执行代码文件。为了保证类文件的平台无关性,Java虚拟机规范中对类文件的格式也做了详细的说明。
上图就是jvm运行时的状态。Java程序在运行时,须要在内存中的分配空间。为了提升运算效率,就对数据进行了不一样空间的划分,由于每一片区域都有特定的处理数据方式和内存管理方式。
【大厂面试经:说一下大家线上JVM是如何优化的?】
【http://www.javashuo.com/article/p-gvqtoowt-bx.html】
参考
https://www.cnblogs.com/IUbanana/p/7067362.html
https://www.cnblogs.com/smyhvae/p/4810168.html