>[warning] java程序运行在虚拟机上
## JVM所处的位置
![](http://img.blog.csdn.net/20160816185506969?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
## JDK、JRE和JVM三者之间关系
* jvm:Java虚拟机-(负责执行符合规范的Class文件)
* jre: 运行时环境-(包含jvm和类库)
* jdk:java开发工具包-(包含jre和开发工具包)
![](http://img.blog.csdn.net/20160614105103329?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
## Class字节码
编译后被Java虚拟机所执行的代码使用了一种平台中立(不依赖于特定硬件及操作系统的)的二进制格式来表示,并且经常(但并非绝对)以文件的形式存储,因此这种格式被称为Class文件格式。Class文件格式中精确地定义了类与接口的表示形式.
![](http://img.blog.csdn.net/20160816185601413?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
## ava虚拟机的体系结构
![](http://images2015.cnblogs.com/blog/665375/201601/665375-20160126212928129-1855187537.png)
1. 类装载子系统.
2. 运行引擎.负责执行包含在已装载的类或接口中的指令.
3. 运行数据区域.方法区、Java堆、Java虚拟机栈、PC寄存器、本地方法栈,还有常量池
## 运行数据区域
### 线程共享数据区
包括:Java堆、方法区。它们会随着虚拟机启动而创建,随着虚拟机退出而销毁。
#### 1.Java堆
Java堆主要用来为类实例对象分配内存。
[详细了解](http://blog.csdn.net/ljheee/article/details/52196455)
#### 2.方法区(静态区)
存储运行时常量池,类(即时编译器编译后的行为代码+静态变量)
### 线程私有数据区
### 3.java栈
描述Java方法(函数)执行的内存模型.
栈帧:局部变量表、操作数栈、动态链接、方法出口
>[info] 局部变量表所需的内存空间大小在编译期间完成分配。
#### 4.本地方法栈
用于支持native方法的运行内存模型。(native方法,比如用C/C++实现的代码)
#### 程序计数器
记录当前线程所执行到的字节码的行号.