background image

1 JVM 简介

JVM  是我们 Javaer  的最基本功底了,刚开始学 Java 

的时候,一般都是从 Hello 

World”开

始的,然后会写个复杂点 class,然后再找一些开源框架,比如 Spring,Hibernate 等

等,再然后

就开发企业级的应用,比如网站、企业内部应用、实时交易系统等等,直到某一天突然
发现做的系

统 咋 就 这 么 慢 呢 , 而 且 时 不 时 还 来 个 内 存 溢 出 什 么 的 , 今 天 是 交 易 系 统 报 了
StackOverflowError,

明 天 是 网 站 系 统 报 了 个 OutOfMemoryError , 这 种 错 误 又 很 难 重 现 , 只 有 分 析
Javacore 和 dump 文

件,运气好点还能分析出个结果,运行遭的点,就直接去庙里烧香吧!每天接客户的电
话都是战战

兢兢的,生怕再出什么幺蛾子了。我想 Java 做的久一点的都有这样的经历,那这些问题

的最终根

—— 

结是在哪呢?

JVM。

JVM 全称是 Java Virtual Machine,Java 虚拟机,也就是在计算机上再虚拟一个计算

机,这

 

和我们使用 VMWare 不一样,那个虚拟的东西你是可以看到的,这个 JVM 你是看不到

的,它存在内
存中。我们知道计算机的基本构成是:运算器、控制器、存储器、输入和输出设备,那

这个 JVM

也是有这成套的元素,运算器是当然是交给硬件 CPU 

还处理了,只是为了适应 一次编

译,随处运

行 的情况,需要做一个翻译动作,于是就用了 JVM 自己的命令集,这与汇编的命令集

有点类似,
每一种汇编命令集针对一个系列的 CPU,比如 8086 系列的汇编也是可以用在 8088 上

的,但是就不
能跑在 8051 上,而 JVM 的命令集则是可以到处运行的,因为 JVM 做了翻译,根据不同

的 CPU,翻

译成不同的机器语言。
JVM 中我们最需要深入理解的就是它的存储部分,存储?硬盘?NO,NO  

, JVM 是一个

内存中的

虚拟机,那它的存储就是内存了,我们写的所有类、常量、变量、方法都在内存中,这
决定着我们

程序运行的是否健壮、是否高效,接下来的部分就是重点介绍之。
2 JVM 的组成部分

我们先把 JVM 这个虚拟机画出来,如下图所示:

慢慢琢磨 JVM

从这个图中可以看到,JVM 是运行在操作系统之上的,它与硬件没有直接的交互。我们

再来看

下 JVM 有哪些组成部分,如下图所示:

该图参考了网上广为流传的 JVM 构成图,大家看这个图,整个 JVM 分为四部分:

_ Class Loader 类加载器

类加载器的作用是加载类文件到内存,比如编写一个 HelloWord.java 程序,然后通过

javac

编译成 class 文件,那怎么才能加载到内存中被执行呢?Class Loader 承担的就是这个

责任,那
不可能随便建立一个.class 文件就能被加载的,Class Loader 加载的 class 文件是有格

式要求,
在《JVM Specification》中式这样定义 Class 文件的结构:

ClassFile {
u4 magic;

u2 minor_version;

慢慢琢磨 JVM

u2 major_version;