一: java 虚拟机的体系结构图:
体系结构图
jvm : 中文名称叫 Java 虚拟机, 它是由软件技术模拟出计算机运行的一个虚拟的计算机. 我们都知道 Java 的程序需要经过编译后, 产生. Class 文件, JVM 才能识别并运行它, JVM 针对每个操作系统开发其对应的解释器, 所以只要其操作系统有对应版本的 JVM, 那么这份 Java 编译后的代码就能够运行起来, 这就是 Java 能一次编译, 到处运行的原因. 简单来说就是够运行 Java 字节码的虚拟机.
Java 编译器: 将 Java 源文件 (.java 文件) 编译成字节码文件(.class 文件, 是特殊的二进制文件, 二进制字节码文件), 这种字节码就是 JVM 的 "机器语言".javac.exe 可以简单看成是 Java 编译器.
类加载器: Java 类加载器 (Java Classloader) 是 Java 运行时环境 (Java Runtime Environment) 的一部分, 负责动态加载 Java 类到 java 虚拟机的内存空间中.
执行引擎: 通过类装载器装载的, 被分配到 JVM 的运行时数据区的字节码会被执行引擎执行. 执行引擎以指令为单位读取 Java 字节码. 它就像一个 CPU 一样, 一条一条地执行机器指令. 每个字节码指令都由一个 1 字节的操作码和附加的操作数组成. 执行引擎取得一个操作码, 然后根据操作数来执行任务, 完成后就继续执行下一条操作码. 可以有解释器执行与编译执行两种选择, 输入的是字节码文件, 处理过程是字节码解析的等效过程, 输出的是执行结果.
1, 解释器
一条一条地读取, 解释并且执行字节码指令. 因为它一条一条地解释和执行指令, 所以它可以很快地解释字节码, 但是执行起来会比较慢. 这是解释执行的语言的一个缺点. 字节码这种 "语言" 基本来说是解释执行的.
程序启动时首先发挥作用, 解释执行 Class 字节码;
省去编译时间, 加快启动速度;
但执行效率较低;
2,JIT 编译器(jvm 即时编译器)
即时编译器被引入用来弥补解释器的缺点. 执行引擎首先按照解释执行的方式来执行, 然后在合适的时候, 即时编译器把整段字节码编译成本地代码. 然后, 执行引擎就没有必要再去解释执行方法了, 它可以直接通过本地代码去执行它. 执行本地代码比一条一条进行解释执行的速度快很多. 编译后的代码可以执行的很快, 因为本地代码是保存在缓存里的.
程序解释运行后, JIT 编译器逐渐发挥作用;
编译成本地代码, 提高执行效率;
但占用程序运行时间, 内存等资源;
不过, 用 JIT 编译器来编译代码所花的时间要比用解释器去一条条解释执行花的时间要多. 因此, 如果代码只被执行一次的话, 那么最好还是解释执行而不是编译后再执行. 因此, 内置了 JIT 编译器的 JVM 都会检查方法的执行频率, 如果一个方法的执行频率超过一个特定的值的话, 那么这个方法就会被编译成本地代码.
二: 运行是数据区结构图:
内存区域
java 堆 :java 堆是 jvm 内存管理中最大的一块, 线程共享. 在 jvm 启动的时候创建. 此区域唯一目的就是存放对象实例, 几乎所有的对象实例都在这里分配内存. Sun JDK 从 1.2 开始对堆采用了分代管理, 分为新生代与老年代.
方法区: 线程共享, 是用来存储已被 JVM 加载的类信息, 常量, 静态变量, 即时编译器编译后的代码等数据.
虚拟机栈: JVM 栈是线程私有的, 它的生命周期与线程相同. JVM 栈描述的是 java 方法执行的内存模型, 每个方法在执行的同时都会创建一个栈帧, 用于存储局部变量表, 操作数栈, 动态链接, 方法出口等信息. 每个方法从调用直至执行完成的过程, 就对应着一个栈帧在虚拟机栈中入栈到出栈的过程.
本地方法栈: 本地方法栈和 JVM 栈非常相似, 它们之间的区别不过是 jvm 栈是为执行 java 方法服务, 而本地方法栈是为 jvm 使用到对的本地方法服务.
程序计数器: 程序计数器是一块较小的内存空间, 线程私有. 它可以看作是当前线程所执行的字节码的行号指示器.
直接内存: java 的 NIO 库允许 java 程序直接使用内存从而提高性能, 通常直接内存速度会优于 java 堆. 读写频繁的场合可能会考虑使用.
运行时常量池(Runtime Constant Pool) : 它是方法区的一部分. Class 文件中除了有类的版本, 字段, 方法, 接口等描述等信息外, 还有一项信息是常量池(Constant Pool Table), 用于存放编译期生成的各种字面量和符号引用, 这部分内容将在类加载后存放到常量池中.
三, JVM 基本原理介绍
jvm 体系总体分四大块:
类的加载机制
jvm 内存结构
GC 算法 垃圾回收:
GC 分析 命令调优(更新中)
来源: http://www.jianshu.com/p/45a8b21d9a9a