JVM(1) - 基础体系结构

3/8/2017来源:ASP.NET技巧人气:424

概述

基本概念

JVM:全称是java Virtual Machine,是一种能够执行java bytecode(字节码)的虚拟机。 JIT:全称为Just-in-time compiler,即时编译编译器,用于将java字节码转换成可以直接发送给处理器的指令程序 java字节码:java虚拟机执行的一种指令格式,对应为java的class文件,具体可以通过javac命令进行源码编译来生成 Garbage Collector: PC Register:全称为:PRogram Counter Register

jvm的存在价值

      谈起java语言,不得不说的就是jvm虚拟机。主要由于jvm实现了“平台无关性”。编译后的java程序指令并不能直接在硬件系统CPU上执行,而是由JVM执行。JVM屏蔽了与具体平台相关的信息,使得java语言编译程序只需要生成在JVM上运行的目标字节码(.class),就可以在多种平台上不加修改地运行。java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。因此jvm是java程序能在多平台进行无缝移植的可靠保证,同时jvm也是java程序安全检查的检测引擎。

jvm的生命周期

概念区分-jvm实例和jvm执行引擎实例

JVM实例对应了一个独立运行的java程序,它是进程级别。 JVM执行引擎实例则对应了属于用户运行程序的线程,它是线程级别的。 PS:jvm的生命周期,和jvm对象的生命周期是不一样的,对象生命周期后续可以专门文章来做下分享哈。

jvm实例生命周期

启动阶段:启动一个java程序,jvm实例就诞生;任何一个拥有main方法的class类都可以作为jvm实例运行的起点。 PS:同一机器运行多个main应用,则会生成多个jvm实例 运行阶段:main作为程序初始线程的起点,其他线程均由该线程启动;jvm内部有两种线程,守护线程和非守护线程,main属于非守护线程,守护线程由jvm自己使用。 消亡阶段:当程序中的所有非守护线程都终止时,jvm就会退出;若安全管理器允许,程序也可以使用Runtime类或System.exit退出。

jvm体系结构

结构图

这里写图片描述 图片摘自javapapers网站:http://javapapers.com

体系模块划分

ClassLoader Subsystem,加载器子系统 专用来加载.class文件,注意只载入需要的类文件到JVM中的运行时数据区域中,但不负责类的执行与否

Runtime Data Area,运行时数据区 提供程序运行时所需要的数据,包含方法区、堆、java栈、PC寄存器、本地方法栈

Execution Engine,执行引擎 包含两部分:JIT和GC,而JIT用于执行字节码,或执行本地方法;执行过程采用的是自定义的一套指令系统。GC则用于堆内存空间的回收管理。

Native Method Interface和Library,本地方法接口和本地方法库

类加载器原理

什么是类加载器

      类加载器是一个用来加载类文件的类,名为ClassLoader。java源代码通过javac编译器编译成class文件,然后由jvm的执行引擎来负责程序实行。那么类加载器负责加载文件系统、网络或其他来源的类文件,默认有三种类加载器:Bootstrap类加载器、Extension类加载器和System类加载器(也叫APPClassLoader)。

Bootstrap类加载器:也称为初始类加载器。对应JRE/lib/rt.jar PS:负责加载rt.jar中的JDK类文件,它是所有类加载器的父加载器。Bootstrap类加载器没有任何父类加载器,如果你调用String.class.getClassLoader(),会返回null,任何基于此的代码会抛出NUllPointerException异常。

Extension类加载器:对应JRE/lib/ext或java.ext.dirs指向的目录。 PS:负责将加载类的请求先委托给它的父加载器,也就是Bootstrap,如果没有成功加载的话,再从jre/lib/ext目录下或者java.ext.dirs系统属性定义的目录下加载类。Extension加载器由sun.misc.Launcher$ExtClassLoader实现。

APPClassLoader类加载器:对应ClassPath环境变量,或由-classpath或-cp选项定义,或者是JAR中的Manifest的classpath属性定义. PS:其负责从classpath环境变量中加载某些应用相关的类,classpath环境变量通常由-classpath或-cp命令行选项来定义,或者是JAR中的Manifest的classpath属性。application类加载器是Extension类加载器的子加载器。通过sun.misc.Launcher$AppClassLoader实现。

用户自定义类加载器:该加载器是留给程序员拓展用的,主要实现是通过java.lang.ClassLoader来继承实现的

工作原理

类加载的方式

隐式装载: PS: 显式装载: PS:

类加载过程

类加载顺序

核心工作机制

委托机制

可见性机制

单一性机制

何时使用类加载器

自定义类加载器

jvm执行引擎

主要的执行技术

四种执行指令

执行过程解析

运行时数据区

PC寄存器

JVM栈

堆(heap)

方法区域(Method Area)

运行时常量池(Runtime Constant Pool)

本地方法堆栈(Native Method Stacks)

垃圾回收器GC

PS:该部分此处不详细展开,后续会单独专题来做深入的学习和探讨

字节码技术的应用

怎样用字节码分析程序性能

如何实现字节码加载的hotswap