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