慢慢琢磨JVM——恭喜JavaEye重新开张

  • Post author:
  • Post category:java



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];