1、JVM的历史和背景java
2、JVM的执行过程
数组
JVM在整个JDK中处于在最底层,负责与操做系统交互,用来屏蔽操做系统环境,提供一个完整的java程序运行环境。操做系统装入JVM是经过jdk中Java.exe来完成的,经过如下四个步骤完成JVM环境的执行 1)、建立JVM装在环境和配置,2)、装载JVM.dll 3)、初始化JVM.dll并得到JNIENV接口4)、调用JNIEnv实例装载并找到类的Main()方法去处理。以下图所示:
函数
3、JVM的基本结构性能
一、类装载器 (classLoader,用来装载.class文件)操作系统
二、执行引擎(执行字节码,或者执行本地方法)
线程
三、内存空间(方法区、java堆、java栈,本地方法栈)指针
四、PC寄存器 (用于存储每一个线程下一步将执行的JVM指令)对象
五、垃圾回收器
接口
内存空间和PC寄存器组成了运行时数据区。以下图所示:内存
运行时数据区讲解:
一、PC寄存器
每一个线程拥有一个寄存器
在线程建立时建立
用于存储每一个线程下一步将执行的JVM指令
执行native方法时,则PC寄存器不存储任何信息,值为undefined
二、方法区域(method Area)
在JDK中这块区域和永久区(PermanetGeneration)关联起来,又叫持久代
保存类装载信息(名称、修饰符等)、类中的静态变量(static修饰)、final修饰的常量、字段(field)x 信息、方法(method)信息。
方法区域是全局共享的,在必定条件下也会被垃圾回收机制回收(GC)
方法区内存超出容许大小,会跑出内存溢出(OutOfMemory)错误
三、java堆
存储对象的实例和数组值的区域,能够认为全部经过new建立的对象都须要在Java堆内存中分配。
GC主要是对堆Heap内存进行回收。
全部线程共享java堆,因此在堆上进行对象分配内存都须要加锁,因此建立对象比较耗时的。
Sun Hotspot JVM为了提高对象内存分配的效率,对于所建立的线程都会分配一块独立的空间TLAB(Thread Local Allocation Buffer),其大小由JVM根据运行的状况计算而得,在TLAB上分配对象时不须要加锁,所以JVM在给线程的对象分配内存时会尽可能的在TLAB上分配,在这种状况下JVM中分配对象内存的性能和C基本是同样高效的,但若是对象过大的话则仍然是直接使用堆空间分配
TLAB仅做用于新生代的Eden Space,所以在编写Java程序时,一般多个小的对象比大的对象分配起来更加高效。
全部建立的对象都会存储在新生代对内存中(Yong Generation),若是Yong Generation 在屡次的垃圾回收中(GC在)中存活了下来,这些内存信息将被转移到Old Generation 中
新的对象老是建立在Eden Space
堆上分配的空间,每次须要GC 清理空间
四、java栈
线程私有
栈由一系列的帧组成(java栈也叫作帧栈),帧上保存一个方法的局部变量、操做数栈、常量池指针
栈中存放的基本类型的变量,以及部分返回结果和stack Frame,非基本类型的对象在JVM栈上存放的是一个指向JVM堆上地址。
栈上分配的内存空间,函数(方法)调用完后自动释放