详细理解Java虚拟机的运行过程

基本概述:

  Java虚拟机简称JVM,是JRE中的一部分,也是Java程序运行的最关键的部分。完整的Java运行流程大致包括编译.java文件形成.class文件,然后根据.class文件的内容进行一系列的步骤使整个程序运行起来。其中将.java文件编译为.class文件由Java编译器完成,而由.class文件进而完成整个运行过程则主要是由JVM来完成的。由于所有的编译链接过程都由JRE来完成,所以Java具有良好的平台可移植性,不依赖具体的操作系统。

具体结构及功能:

1、Class Loader:

  该子系统主要负责以下三种工作。

  一、读取(Loading):Class Loader会首先读取由Java编译器传入的.class文件,然后生成相对应的二进制数据并将其存入方法区,这其中生成的数据主要包括类名、紧邻的父类、各种修饰符、变量和方法的信息。在这之后,JVM会自动给这个类创建一个类型为Class的对象并存入堆中,这个对象可以被程序员调用,从而得到这个类中的相关信息(也就是上面所讲的存入方法区的那些信息)。需要注意的是,一个类只会具有一个Class对象,也就是说,就算有无穷个该类的不同对象,在堆中也只会有一个对应的Class对象。

  二、链接(Linking):在读取之后,Class Loader会对.class文件进行正确性验证,看看该类是否被正确定义,同时是否被正确编译。如果验证成功,那么JVM就会为类中的变量分配内存,并且初始化内存为默认值。

  三、初始化(Initialization):在这一阶段,所有的静态变量将被正确赋值,赋值的顺序是按照代码顺序从前往后,从父类到子类。

  而对于Class Loader来说,其实也大致分为三类。第一类是Bootstrap Class Loader,我们可以理解为最基础的Class Loader,因为它只会处理那些已经被完全信任的class,也就是Java的核心类;第二类是Extension Class Loader,它会处理那些被放置在指定的扩展类文件夹中的类;第三类是Application Class Loader,它处理的是外界定义的类。至于其中的具体不同呢,在此就不展开叙述了。

2、JVM Memory:

  JVM的内存区是其存放具体数据和对象的主要区域,总共由以下五部分组成。

  一、方法区(Method Area):方法区中主要存取的是Class级别的数据,包括类名,父类名,方法名,变量名和静态变量等等。每一个JVM只有一块方法区,所以是一个可以被所有类和进程共享的区域。

  二、堆(Heap Area):堆中存放着所有对象的信息。每一个JVM也只有一个堆,意味着堆也是被共享的。

  三、栈(Stack Area):JVM会为每一个线程开辟一个栈区,而每一个栈区中又会分成许多的块(Block),每一个块都代表一个方法调用,方法中的所有本地变量都会存放在栈中相对应的块中。一旦该线程终止,那么这个栈就会被JVM销毁。所以栈区是不共享的。

  四、PC计数器(PC Register):记录每一个线程当前运行到的代码地址。显然,每一个线程都会有一个对应的PC计数器,所以也是不共享的。

  五、本地方法区(Native Method Area):每一个线程都会有一个本地方法区,其主要存放本地方法的相关信息。

3、Execution Engine:

  运行引擎负责真正地运行.class文件,它会一行一行地读取.class中的二进制信息,然后利用JVM Memory中的数据一条一条地执行。垃圾回收器也是在这个引擎中,它可以自动检测不再可能被引用的已分配内存并将其回收。

  

  JVM的大致运行过程到这里就告一段落了。当然,还有许许多多的细节在这里没有列出,如果有需要,查阅官方文档是最好的办法。

原文地址:https://www.cnblogs.com/cauchymars/p/10497804.html

时间: 2024-09-29 15:48:20

详细理解Java虚拟机的运行过程的相关文章

深入理解Java虚拟机:运行时数据区域

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁.根据<Java虚拟机规范(Java SE 7版)>的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域. 程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里

深入理解Java虚拟机笔记---运行时栈帧结构

栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区的虚拟机栈(Virtual Machine Stack)的栈元素.栈帧存储了方法的局部变量表,操作数栈,动态连接和方法返回地址等信息.第一个方法从调用开始到执行完成,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程. 每一个栈帧都包括了局部变量表,操作数栈,动态连接,方法返回地址和一些额外的附加信息.在编译代码的时候,栈帧中需要多大的局部变量表,多深的操作数栈都已经完全确定了,并且写入到了方法表的

深入理解Java虚拟机笔记---类加载过程

一.加载 "加载"(Loading)阶段是"类加载"(Class Loading)过程的一个阶段.在加载阶段,虚拟机需要完成以下三件事情: a.通过一个类的全限制名来获取定义此类的二进制字节流. b.将这个字节流所代表的静态存储结构转化为方法区的运行进数据结构. c.在Java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的访问入口. 虚拟机规范的这三点要求实际上并不具体,因此虚拟机实现与具体应用的灵活度相当大.例如"通过一

《深入理解Java虚拟机》:类加载的过程

<深入理解Java虚拟机>:类加载的过程 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载.验证.准备.解析.初始化.使用和卸载七个阶段.其中类加载的过程包括了加载.验证.准备.解析.初始化五个阶段. 下面详细讲述类加载过程中每个阶段所做的工作. 加载 加载时类加载过程的第一个阶段,在加载阶段,虚拟机需要完成以下三件事情: 1.通过一个类的全限定名来获取其定义的二进制字节流. 2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构. 3.在Java堆中生成一

【深入理解Java虚拟机】Java内存区域模型、对象创建过程、常见OOM

本文内容来源于<深入理解Java虚拟机>一书,非常推荐大家去看一下这本书.最近开始看这本书,打算再开一个相关系列,来总结一下这本书中的重要知识点.呃呃呃,说好的那个图片请求框架呢~  不要急哈,因为这个请求框架设计的内容还是比较广的,目前业余时间正在编写当中,弄好了之后就会放上来.在完成之前,咱还是先来学习一下其他知识. 1.内存模型 java虚拟机在执行java程序的过程中会把它说管理的内存划分为若干个不同的数据区域,如下图所示: 图片来源于网络 (1)程序计数器(Program Count

你还在看《深入理解Java虚拟机》的运行时数据模型吗?

学习JVM必看的书籍无疑是<深入理解Java虚拟机>这本书了,在书中,关于运行时数据区域模型是这样描述的: 在这里我们只针对HotSpot VM来说,它是OracleJDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机.在JDK7之前,这样的模型是正确的.但是到了JDK8,如图标红的部分,做了一些优化. 什么是方法区,什么是永久代,运行时常量池又是什么 "方法区"(Method Area),是线程共享的区域,用于存储已被虚拟机加载的类信息,常量,静态变

深入理解java虚拟机之类文件结构

我们都知道,java是一种平台无关的语言.java代码通过java编译器(如javac等),将.java文件编译成字节码,也就是.class文件.字节码是运行在jvm虚拟机之上的.而不同的平台则 有不同的虚拟机映射规则.因此,我们从虚拟机上面一层来看,java是平台无关的.write once ,写的java程序,只要在装了jre的电脑,或者任何设备中,都可以运行,也就是run anywhere. 下面主要介绍一下从深入理解Java虚拟机中学习到的类文件结构,也就是class文件规范. clas

《深入理解Java虚拟机》虚拟机性能监控与故障处理工具

上节学习回顾 从课本章节划分,<垃圾收集器>和<内存分配策略>这两篇随笔同属一章节,主要是从理论+实验的手段来讲解JVM的内存处理机制.好让我们对JVM运行机制有一个良好的概念,才能继续往下学习. 本节学习重点 本节主要是针对JVM内存管理机制的一些监控手段,例如堆情况使用的监控,线程栈情况的监控等.有几句废话还是有必要在这里强调的,工具是人类思维的工具,例如Java语言是人类满足需求的一种技术手段,而监控工具只是维护程序应用的一种手段.所以,思考的逻辑思维要清晰,是问题引导工具,

《深入理解Java虚拟机》第二部分(8)

给一个系统定位问题的时候,知识.经验是关键基础,数据是依据,工具是运用知识处理数据的手段.这里的数据包括:运行日志.异常堆栈.GC日志.线程快照(threaddump/javacore文件).堆转储快照(heapdump/hprof文件)等.经常使用适当的虚拟机监控和分析的工具可以加快我们分析数据和定位解决问题的速度,但我们在学习工具前,也应当意识到工具永远都是知识技能的一层包装,没有什么工具是"秘密武器",学会了就能包医百病. JDK的命令行工具 Java开发人员肯定都知道JDK的b