我的面试经之JVM(一)JVM简述
Java 跨平台语言
JVM 跨语言平台
Java进化史:
虚拟机:Virtual Machine,对硬件进行模拟的软件,虚拟的计算机
Java虚拟机:执行Jvm字节码的虚拟计算机,是二进制字节码的运行环境
JVM的位置
jvm整体结构
方法区和堆,多个线程共享
Java栈(又叫虚拟机栈),本地方发栈,程序计数器这三个每个线程独有一份
【运行时数据区是单例的,一个虚拟机一个】
【hotspot 才有方法区,其他两大商用虚拟机没有【HotSpot,JRocket,J9】】
class files前边是编译器前端
执行引擎相当于编译器后端
java代码执行流程
第一次编译,把java源文件编译成字节码.class文件,第二次编译JIT编译器把.class文件编译成机器指令文件,并且缓存到方法区
JVM架构模型
指令集架构分为两种,基于栈的指令集架构,基于寄存器的指令集架构
两种指令集架构区别
基于栈式架构的特点:
设计和实现简单【每执行一个方法,就进行一次入栈的操作】,适用于资源受限的系统(eg:嵌入式)
避开了寄存器的分配难题;使用零地址指令分配方式
指令流中的指令大比分是零地址指令,其执行过程依赖于操作栈,指令集更小,编译器容易实现
不需要硬件实现,可以执性更好,更好实现跨平台
基于寄存器架构的特点:
典型的是x86的二进制指令集:比如传统的PC以及Android 的Davlik虚拟机
指令集架构完全依赖于硬件,可移植性差
性能优秀和执行更高效(指令集少,指令长)、
花费更少的指令去完成意向操作
带大部分情况下,基于寄存器架构的指令集往往都以一地址指令,二地址指令,三地址指令为主,而基于栈架构的指令集以零地址指令为主
JVM的生命周期
启动
通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的
执行
运行的虚拟机的任务:执行Java程序
程序开始时运行,程序结束时就停止
执行一个所谓的Java程序,真真正正执行的一个叫做Java虚拟机的进程
退出
程序正常执行结束
程序在执行过程中遇到异常或错误异常终止
由于OS出现错误导致JVM进程终止
某线程调用Runtime类的exit方法,或halt方法,并且Java安全管理器也允许这次exit或halt方法
除此之外,JNI(Java Native Interface)规范描述了用JNI Invocation API 来加载或卸载时,Java虚拟机退出的情况