基本概述:

  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. 2-sat HDU 1814

    题解来自于:http://www.cnblogs.com/kuangbin/archive/2012/10/05/2712622.html 和平委员会 根据宪法,Byteland民主共和国的公众和平委 ...

  2. JVM调优总结(3):垃圾回收面临的问题

    如何区分垃圾 上面说到的“引用计数”法,通过统计控制生成对象和删除对象时的引用数来判断.垃圾回收程序收集计数为0的对象即可.但是这种方法无法解决循环引用.所以,后来实现的垃圾判断算法中,都是从程序运行 ...

  3. 更改gradle的java的class文件输出目录的结构

    group 'com.thinkvenus.common'version '1.0-SNAPSHOT' apply plugin: 'java' sourceCompatibility = 1.8 r ...

  4. 2008 Round 1A C Numbers (矩阵快速幂)

    题目描述: 请输出(3+√5)^n整数部分最后3位.如果结果不超过2位,请补足前导0. 分析: 我们最容易想到的方法肯定是直接计算这个表达式的值,但是这样的精度是不够的.朴素的算法没有办法得到答案.但 ...

  5. Thinkphp的SQL查询方式

    一.普通查询方式 a.字符串$arr=$m->where("sex=0 and username='gege'")->find();b.数组$data['sex']=0 ...

  6. python使用requests模块模拟登陆知乎

    from bs4 import BeautifulSoup import requests import time def captcha(captcha_data): with open(" ...

  7. 在C#中用MediaInfo获取视频或音频的属性

    MediaInfo是一个开源的获取视频或音频的信息的非常便利的工具,它本身就带有一个GUI界面,可以非常方便我们查看视频信息.但是,当我们写一些转码程序时,往往需要在程序中获取视频信息的时候. 以前我 ...

  8. NuGet Package Explorer上传时报:failed to process request:'Method Not Allowed'错误解决办法

    相关日志:PUT /api/v2/package - 1000 -  NuGet+Package+Explorer/3.15.0.0+(Microsoft+Windows+NT+6.2.9200.0) ...

  9. Caused by: android.content.res.Resources$NotFoundException: Resource ID #0x7f070058 android-studio 3.0 from canary 5 to canary 6

    我升级android-studio到了3.0 canary 6打包编译安装出现如下错误: 07-11 13:00:39.523 8913-8913/dcpl.com.myapplication E/A ...

  10. C/C++——[05] 函数

    函数是 C/C++语言中的一种程序组件单位.一个函数通常代表了一种数据处理的功能,由函数体和函数原型两部分组成.函数原型为这个数据处理功能指定一个标识符号(函数的名称).说明被处理数据的组成及其类型. ...