JVM概述
JVM:
Java虚拟机是一台抽象的计算机,其规范定义了每个java虚拟机都必须实现的特性,同时为每个实现都留下了很多选择,比如它同时允许虚拟机使用纯软件的方式实现执行Java字节码或很大部分又硬件实现,这一特性保证了JVM的跨平台性。Java文件编译顺序如下

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的体系结构
当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。

浙公网安备 33010602011771号