Fork me on GitHub

JVM系列(一)

初识Java虚拟机

1. 什么是Java虚拟机

虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

Java虚拟机存在的原因是可以屏蔽底层操作系统的不同,使得同一个java文件编译生成的字节码文件可以通过不同的操作系统对应的java虚拟机,它把字节码解释成具体平台上的机器指令执行 。java使得java语言可以做到”一次编译,到处运行“。因此,java是一种跨平台的语言。

因为有了Java虚拟机这一层“解释”,会使得java程序运行时间比C/C++等语言慢。

2. 从进程的角度理解JVM

众所周知,Java虚拟机是运行在操作系统之中的,那么它在运行的时候就是操作系统的一个进程,因为进程是操作系统的执行单位。当它在运行的时候,它就是一个操作系统中的进程实例,当它没有在运行时(作为可执行文件存放于文件系统中),可以把它叫做程序。

1
2
javac xxx.java
java xxx

相信上面两条命令,大家肯定很熟悉了。执行完第一步之后,生成java文件对应的字节码,而操作系统是无法直接识别字节码的,此时就需要调用操作系统对应的虚拟机将字节码解释成操作系统所能识别的二进制可执行文件。此时我们调用了一个名叫java的程序,而这个程序运行之后就是一个JVM实例。

执行的流程

java命令执行后启动虚拟机进程,虚拟机进程启动完毕之后会读取参数(即 java命令后面接的.class文件名和一些命令行传参的参数),把他作为初始类加载到内存,对这个类进行初始化和动态链接。(初始化和动态链接在后面会讲,此处留个印象即可)接下来便是从该类的main方法开始执行。

总结分析

  • .class文件不是直接被系统加载之后就直接在CPU执行的,而是被一个叫做虚拟机的进程托管的。首先必须虚拟机进程启动就绪,然后由虚拟机中的类加载器加载必要的class文件,包括jdk中的基础类(如String和Object等),然后由虚拟机进程解释class字节码指令,把这些字节码指令翻译成本机cpu能够识别的指令,才能在cpu上运行。
  • 更深层次的讲,当我们在运行class文件的时候,其实真正执行的是Java虚拟机进程,而不是我们的程序。那我们写的编译生成的class文件是有什么作用呢?它只是虚拟机进程执行时需要的“原料”。这些“原料”在运行时被加载到虚拟机中,被虚拟机解释执行,以控制虚拟机实现我们java代码中所定义的一些相对高层的操作,比如创建一个文件等,可以将class文件中的信息看做对虚拟机的控制信息,也就是一种虚拟指令。 虚拟机只是处理一些底层的操作,例如内存的分配和释放等等。

3.JVM体系结构简介

一个Java虚拟机在运行过程中有三个子系统保证它的正常运行,分别是类加载器子系统,执行引擎子系统,垃圾收集子系统。

类加载器子系统

这个子系统用来在运行的时候根据需要动态加载类,“根据需要”代表的便是当虚拟机运行过程中需要该类,才会去加载它,而不是一次性加载所有的类。

执行引擎子系统

由虚拟机加载的类,被加载到Java虚拟机内存中之后,虚拟机会读取并执行它里面存在的字节码指令。虚拟机中执行字节码指令的部分叫做执行引擎。

垃圾收集子系统

Java虚拟机会进行自动内存管理。具体说来就是自动释放没有用的对象,而不需要程序员编写代码来释放分配的内存。这部分工作由垃圾收集子系统负责。

-------------本文结束感谢您的阅读-------------

本文标题:JVM系列(一)

文章作者:AllenYu

发布时间:2019年01月11日 - 16:01

最后更新:2019年01月11日 - 16:01

原始链接:http://yuzeduan.github.io/2019/01/11/JVM系列-一/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。