基本概述:

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

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

  1. 深入理解Java虚拟机(一) 运行时数据区划分

    前言:从我学Java的第一天开始,我的大学老师就告诉我 Java语言相比C.C++的语言有一个非常强大的功能,那就是自动内存管理:我们用Java编码时不需要申请或释放内存等,这些工作全部交由我们的Ja ...

  2. 深入理解Java虚拟机-JVM运行时数据区域

    一.运行时数据区域 1.程序计数器 程序计数器( Program Counter Register) 是一块较小的内存空间, 它可以看作是当前线程所执行的字节码的行号指示器. Java虚拟机的多线程是 ...

  3. 【转载】深入理解Java虚拟机笔记---运行时栈帧结构

    栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区的虚拟机栈(Virtual Machine Stack)的栈元素.栈帧存储了方法的局部变量表,操作 ...

  4. 《深入理解Java虚拟机》(二)Java虚拟机运行时数据区

    Java虚拟机运行时数据区 详解 2.1 概述 本文参考的是周志明的 <深入理解Java虚拟机>第二章 ,为了整理思路,简单记录一下,方便后期查阅. 2.2 运行时数据区域 Java虚拟机 ...

  5. 深入理解java虚拟机(八)类加载过程详解

    类从被加载到虚拟机内存开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading).验证(Verification).准备(Preparation).解析(Resolution).初始化(In ...

  6. 深入理解Java虚拟机 -- 读书笔记(1):JVM运行时数据区域

    深入理解Java虚拟机 -- 读书笔记:JVM运行时数据区域 本文转载:http://blog.csdn.net/jubincn/article/details/8607790 本系列为<深入理 ...

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

    上节学习回顾 从课本章节划分,<垃圾收集器>和<内存分配策略>这两篇随笔同属一章节,主要是从理论+实验的手段来讲解JVM的内存处理机制.好让我们对JVM运行机制有一个良好的概念 ...

  8. JVM学习(1)——通过实例总结Java虚拟机的运行机制

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: JVM的历史 JVM的运行流程简介 JVM的组成(基于 Java 7) JVM调优参数:-Xmx和-Xms ...

  9. Java虚拟机及运行时数据区

    1.Java虚拟机的定义 Java虚拟机(Java Virtual Machine),简称JVM.当我们说起Java虚拟机时,可能指的是如下三种不同的东西: 抽象的虚拟机规范 规范的具体实现 一个运行 ...

随机推荐

  1. NOIP模拟赛8

    今天又爆零啦... T1 题目描述 #define goodcatdog gcd #define important i #define judge  j 神说 每个梦想就是一轮月亮,高高地孤寂地挂在 ...

  2. NOIP 2014 提高组 Day1

    期望得分:100+100+50=250 实际得分:100+100+50=250 此次NOIP  ZJ省一分数线:500,SD:345 https://www.luogu.org/problem/lis ...

  3. Codeforces 221 E. Little Elephant and Shifts

    E. Little Elephant and Shifts time limit per test 2 seconds memory limit per test 256 megabytes inpu ...

  4. 使用HttpClient4来构建Spring RestTemplate

    Spring RestTemplate简单说明 现在REST服务已经很普及了,在我们的程序中,经常会需要调用REST API,这时候会有很多选择,原始一点的JDK自带的,再进一步点使用HttpClie ...

  5. 51nod1110 距离之和最小 V3

    基准时间限制:1 秒 空间限制:131072 KB 分值: 40  X轴上有N个点,每个点除了包括一个位置数据X[i],还包括一个权值W[i].该点到其他点的带权距离 = 实际距离 * 权值.求X轴上 ...

  6. 【leetcode 简单】第四十八题 旋转数组

    给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: [1,2,3,4,5,6,7] 和 k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右旋转 1 ...

  7. ActiveMQ笔记之点对点队列(Point-to-Point)

    1. 点对点通信 点对点是一种一对一通信方式,更像是有一个队列,一个人往队列里放消息,另一个人从队列中取消息,其最大的特点是一个消息只会被消费一次,即使有多个消费者同时消费,他们消费的也是不同的消息. ...

  8. ES6基础知识汇总

    1.如何理解ECMAScript6? ECMAScript是什么,ECMASCript的作用 2.新增let关键字 let的用途 3.关键字const const作用,传址赋值 4.解构赋值 解构赋值 ...

  9. INIT_WORK

    借助runtime pm,在需要使用模块时,增加引用计数(可调用pm_runtime_get),不需要使用时,减少引用计数(可调用pm_runtime_put). 1.INIT_WORK(struct ...

  10. xshell连接Ubuntu虚拟机

    Ubuntu系统 1,安装ssh sudo apt-get install openssh-server 2,启动ssh进程 /etc/init.d/ssh start 3,查看进程信息 ps -e ...