薄情先生|程序员进阶系列:多图教你掌握JVM

提及 JVM 这个词 , 估计大家都能简单说两句 , 但是根据身边朋友以及诸多粉丝提出的疑问 , 能系统讲出来 JVM 的 , 却真心很少 。
网上讲解 JVM 这块的文章非常多 , 不过鱼龙混杂 , 鉴于 JVM 也是最考验 Java 程序员的基础功底啦 , 今天静下来 , 一起画画图 , 一起梳理梳理 , 好好填补一下这块 , 争取无论走到哪里 , 大家在脑海中都能有文中提及的 JVM 内存模型图 。
JVM 初识在讲解 JVM 之前 , 先来揭秘一下 Java 程序是如何实现一次编译到处运行的?
薄情先生|程序员进阶系列:多图教你掌握JVM步骤一:用文本编辑器或者 IDE , 快速编写 HelloWorld.java 的源代码文件;
步骤二:用 Java 编译器(javac)把源代码(*.java)编译成字节码文件(*.class);
步骤三:字节码文件(.class)便可以在任何安装了 JVM 的操作系统中运行 , JVM 会将字节码翻译成可以被机器执行的本地机器码 。
那么重点来了 , Java 是如何实现一次编译到处运行的呢?通过上图应该很清晰找到解 。
解一:Java 一次编译 , 到处运行 , 跨平台的特性是通过 JVM 来实现的 , 通过 JVM 来屏蔽底层操作系统的差异;
解二:Java 通过 JVM 来实现跨平台 , 但是 JVM 是不跨平台的 , 也就是说不同操作系统之上的 JVM 是不同的 , Linux 系统上的 JVM 不能用在 Windows 系统上 。
JVM 窥探既然已经知晓 Java 程序可以通过 JVM 来实现一次编译 , 到处运行的跨平台特性 , 那么 JVM 到底是什么呢?
薄情先生|程序员进阶系列:多图教你掌握JVMJVM 是 Java Virtual Machine(Java虚拟机)的缩写 , JVM 是一种用于计算设备的规范 , 它是一个虚构出来的计算机 , 是通过在实际的计算机上仿真模拟各种计算机功能来实现的 —— 百度百科 。
上面是引了一段百度百科对 JVM 的解释 , 大意就是 Java 虚拟机是在计算机上虚构出来的一个计算机 , 既然是虚构的就意味着看不到 , 只在于内存之中 。
薄情先生|程序员进阶系列:多图教你掌握JVM(图片来源于网络)
如上图所示 , 计算机主要有运算器、控制器、内外存储器、输入和输出设备组成 , 那么 JVM 结构长啥样子呢?
薄情先生|程序员进阶系列:多图教你掌握JVM还是以开篇的 HelloWorld 为例 , 窥探一下 JVM 的运行流程 。
1. Java 源代码文件会被 Java 编译器编译为字节码文件(.class);
2. JVM 中的类加载器进行加载各个类的字节码文件 , 将所有类结构和方法变量放入运行时数据区;
3. 字节码文件加载完毕之后 , 交给 JVM 执行引擎进行执行 。
JVM = 类加载器 ClassLoader + 执行引擎 Execution Engine + 运行时数据区域 Runtime Data Area 。
在程序执行过程中 , 会分配内存空间来存储程序执行期间需要用到的数据相关信息 , 分配的内存空间被称作为 Runtime Data Area(运行时数据区) , 也就是常说的 JVM 内存 , 接下来就重点说一说 JVM 运行时数据区 。
薄情先生|程序员进阶系列:多图教你掌握JVM(JDK 1.7 内存模型)
如上图所示 , JVM 运行时数据区主要分为程序计数器、虚拟机栈、本地方法栈、方法区、堆 。


推荐阅读