JVM:java
Java虚拟机是一台抽象的计算机,其规范定义了每一个java虚拟机都必须实现的特性,同时为每一个实现都留下了不少选择,好比它同时容许虚拟机使用纯软件的方式实现执行Java字节码或很大部分又硬件实现,这一特性保证了JVM的跨平台性。Java文件编译顺序以下c++
Java虚拟机的主要任务是装载class文件并执行其中的字节码,Java虚拟机包含一个类装载器(class loader),它能够从程序和API中装载class文件。Java API只有在被使用的时候才会被装载。字节码由执行引擎来执行。执行引擎在不一样的JVM中有不一样的实现,最简单的是一次性解释字节码,另外一种更快可是更加消耗内存的引擎叫作即时编译器,这种编译器在第一次被执行的字节码编译成本机代码的时候进行缓存。第三种引擎是自适应优化器,它会监视运行中程序的运动并记录下活动最频繁的代码编译成本机代码进行缓存。数组
Java程序经过调用本地方法与主机进行交互。Java中有两种方法Java方法和本地方法。Java由Java编写,编译成字节码储存在class文件中。本地方法又其余语言(c,c++,汇编等)实现,编译成与处理器相关的机器代码,保存在动态库中。Java方法是与平台无关的,但本地方法不是,本地方法是链接Java程序和底层主机操做系统的链接方式。缓存
JVM的生命周期 架构
每一个Java程序都跑在本身的Java虚拟机实例中,虚拟机的启动和退出和虚拟机保持一致。
函数
Java虚拟机经过调用某个类的main函数来运行一个Java程序。Java虚拟机内有两种线程守护线程和非守护线程,守护线程一般是虚拟机本身使用的如内存垃圾收集任务,Java程序也能够把它建立的任何线程给标记为守护线程,而main函数所在线程是非守护线程。当该程序的全部非守护进程都退出时,虚拟机实例也将自动退出,固然程序自己也能调用方法退出。优化
JVM的体系结构 spa
当Java虚拟机运行一个程序时,它须要内存来存储许多东西,如:字节码、从已装载的class文件中获得的其余信息、程序建立的对象、传递给方法的参数、返回值、局部变量及运算的中间结果等,JVM把这些东西都组织到了几个“运行时数据区中”进行管理。
操作系统
当虚拟机装载一个class文件时,虚拟机会从这个class文件中解析出类型信息并放入方法区中,当程序运行时会将全部建立的对象放入堆中。线程
当一个新线程被建立后,它将获得本身的PC寄存器(程序计数器)及Java栈,若是当前线程正在执行一个Java方法,PC寄存器的值将老是指向下一条将被执行的指令,Java栈将会储存该线程中Java方法调用的状态(包括它的局部变量,入参,返回值等)。
Java栈是又许多栈帧组成的,一个栈帧包含一个Java方法调用的状态。当调用一个Java方法时,虚拟机压入一个Java栈帧到栈中,方法退出时,相应的栈帧被弹出。任何线程不能访问另外一个线程的栈和PC寄存器。
Java虚拟机没有寄存器,其指令集使用Java栈来存储。这样设计的缘由是为了保持Java虚拟机的指令集尽可能紧凑以及能在那些只有不多寄存器的平台上实现。
堆 :
Java程序在运行时建立的全部类实例或数组都放在同一个堆里,一个Java虚拟机实例只存在一个堆空间,可是同一个程序的多个线程共享着一个堆空间,在这种状况下就必需要考虑堆数据的同步问题了。
JDK/JRE:
咱们能够把Java程序设计语言、Java虚拟机以及JavaAPI库这三部分统称为JDK(Java Development Kit),JDK是用于支持Java开发的最小环境。
JRE(Java Runtime Environment) 顾名思义 就是Java运行环境的意思 它包括了Java虚拟机和Java SE API子集两部分,是用于支持Java程序运行的标准环境。
JAVA SE/JAVA EE
Java SE(Java Standard Edition) 支持面向桌面级应用的Java平台,提供了完整的Java SE API(java.*),旧称为J2SE。
Java EE(Java Enterprise Edition) 支持使用多层架构企业应用的java平台,除提供了Java SE API外,还提供了大量的扩充(javax.*)并提供了相关的部署支持,旧称J2EE。