写在前面
首先要说明的就是JVM不是指一个机器,也不是一个软件,而是一种规范。不要傻乎乎的觉得JVM就一种,事实上JVM类型多着呢。我们最常用的是HostSpot(TM),此外还有J9,KVM等一堆的虚拟机,而且HostSpot也不是Sun公司自己开发的,实时上Sun公司自己开发的JVM烂的不行,后来一看有家公司做的JVM好牛逼啊,比自己的牛逼多了,然后本着打不过就加入的原则,把人家买了,这才有了自带的HostSpot。
典型JVM规范模式结构图
典型的JVM架构
类加载器:用于加载类,其中最有名的机制叫双亲委派机制,一句话概括就是能啃老绝不自己动手
元数据区(线程公有):存放代码+类对象+常量池+其它乱七八糟的东西
堆区(线程公有):年轻代(伊甸园+From+To)+老年代
栈区(线程私有):本地方法栈+普通方法栈
程序计数器:就是个记录方法是谁,从哪来,要到那里去的哲学3问小老哥
执行引擎:执行class
- 编写类
- 编译类 javac xxx.java
- 运行类 java xxx
- 加载类(加载、验证、准备、解析、初始化、使用和卸载7个阶段。其中验证、准备、解析三个阶段称之为连接)
- 双亲委派机制
Bootstrap ClassLoader(加载java lib基本类库) Extension ClassLoader(加载lib/ext非java库) Application Classloader(加载程序类)
- 双亲委派机制
- 元数据(类package.xxx.class信息)存入方法区(元数据区)
- 类信息
- 常量池:常量/静态变量 包括编译时常量池和运行时常量池
- 即时编译器编译后的代码
- 创建实例(heap)(GC)
- eden
- to/from(幸存区,任何时候只会用到其中一块)
- old
- 执行方法
- java方法栈(由栈帧stack-frame组成),每个栈帧由下面构成
- 局部变量
- 操作数栈
- 动态连接
- 返回地址
- native方法栈(非java语言的方法,用native修饰)
- java方法栈(由栈帧stack-frame组成),每个栈帧由下面构成
- 程序计数器