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
分为四部分:
q
Class Loader
类加载器
类加载器的作用是加载类文件到内存,比如编写一个
HelloWord.java
程序,然后通过
javac
编译成
class
文件,那怎么才能加载到内存中被执行呢?
Class Loader
承担的就是这个责任,那不可能随便建立一个
.class
文件就能被加载的,
Class Loader
加载的
class
文件是有格式要求,在《
JVM Specification
》中式这样定义
Class
文件的结构:
ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];