JVM浅析总结(JVM的生命周期)
# JVM(本文章以jdk8为基础)
# JDK,JRE,JVM关系
项目 | 说明 |
---|---|
JDK(Java Development Kit) | 是Sun微系统针对Java开发人员发布的免费软件开发工具包(SDK (opens new window),Software development kit)作为Java语言的SDK,普通用户并不需要安装JDK来运行Java程序,而只需要安装JRE(Java Runtime Environment)。而程序开发者必须安装JDK来编译、调试程序。JDK包含了一批用于Java开发的组件(eg:javac,java,jar,javadoc等),还包括完整的JRE(Java Runtime Environment),Java运行环境,也被称为private runtime。包括了用于产品环境的各种库类,如基础类库rt.jar,以及给开发人员使用的补充库,如国际化与本地化的类库、IDL库等等 |
JRE(Java Runtime Environment) | 是一个软件,由Sun微系统所研发,JRE可以让电脑系统运行Java应用程序(Java Application),JRE的内部有一个Java虚拟机(Java Virtual Machine,JVM)以及一些标准的类别函数库(Class Library) |
JVM(Java Virtual Machine) | 一种能够运行Java bytecode的虚拟机,以堆栈结构机器来进行实做。最早由Sun微系统所研发并实现第一个实现版本,是Java平台的一部分,能够运行以Java语言写作的软件程序,java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。通过对中央处理器(CPU)所执行的软件实现,实现能执行编译过的Java程序码(Applet与应用程序),作为一种编程语言的虚拟机,实际上不只是专用于Java语言,只要生成的编译文件符合JVM对加载编译文件格式要求,任何语言都可以由JVM编译运行 |
三者的关系图示:
# JVM的指令集(java编译器)架构模型
主流的两种架构特点比较
分类 | 特点 |
---|---|
基于栈的指令集架构 | 设计和实现更简单,适用于资源受限的系统;避开了寄存器的分配难题:使用零地址指令方式分配;指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。指令集更小,编译器容易实现。不需要硬件支持,可移植性更好,更好实现跨平台; |
基于寄存器的指令集架构 | 典型的应用是X86的二进制指令集:比如传统的pc以及andriod的Davlik虚拟机;指令集架构则完全依赖于硬件,可移植性差;性能优秀和执行更高效;花费更少的指令去完成一项操作。在大部分情况下,基于寄存器架构的指令集往往都以一地址指令、二地址指令和三地址指令为主,而基于栈式架构的指令集确是以零地址指令为主 |
所以JVM的指令集(java编译器)架构模型是基于栈的指令集架构
# JVM的生命周期
流程 | 说明 |
---|---|
jvm启动 | 通过引导类加载器(bootstrap class loader)创建一个初始类(inital class),初始化类根据不同的虚拟机(eg: Classic VM,Exact VM,HotSport,JRockit,j9)类型来决定其实现 |
jvm执行 | 执行java程序,程序开始虚拟机执行,程序结束虚拟机结束执行,java程序在jvm中相当于虚拟机到的一个进程 |
jvm退出 | 包含正常退出,异常退出,可调用java api主动退出eg:Runtime类或者exit方法,halt方法 |
通俗三个流程概述 | 启动:任何class文件的main函数都可认为是jvm示例的起点。 运行:以main函数为起点,后续的线程都由它启动,包括守护线程和用户线程。main方法启动的线程是用户线程,守护线程是JVM自己使用的线程如GC线程。 退出&异常退出:用户线程完全退出了,jvm示例结束生命周期。 |
# Java代码简单执行流程
# JVM结构体系图(记住这个图,以此展开拓展)
上次更新: 2023/12/18, 11:52:57