JVM的技术原理

来自CloudWiki
跳转至: 导航搜索

JVM的技术背景

  • Java程序比较特殊,其执行过程,必须经过先编译,后解释两个步骤。
  • 由Java编写的程序需要经过编译步骤,但这个编译步骤不会产生特定平台的机器码,而是生成一种与平台无关的字节码(也就是.class文件)。这种字节码不是可执行性的,必须使用Java解释器来解释执行。因此可以认为: Java语言既是编译型语言,也是解释型语言。 或者说,Java语言既不是纯粹的编译型语言,也不是纯粹的解释型语言。
  • Java语言里,负责解释执行字节码文件的是Java虚拟机,即JVM(Java Virtual Machine)。Java源文件,通过编译器,能够生产相应的.Class文件,也就是字节码文件,而字节码文件又通过Java虚拟机中的解释器,也就是前面所有的Java虚拟机中的字节码指令集,编译成特定机器上的机器码。
  • JVM屏蔽了与具体操作系统平台相关的信息,从而实现了java程序只需生成在JVM上运行的字节码文件(class文件),就可以在多种平台上不加修改地运行。不同平台对应着不同的JVM,在执行字节码时,JVM负责将每一条要执行的字节码送给解释器,解释器再将其翻译成特定平台环境的机器指令并执行。java语言最重要的特点就是跨平台运行,使用JVM就是为了支持与操作系统无关,实现跨平台运行。

JVM的体系结构

  • Java1-102.jpg

垃圾回收器

垃圾回收器(又称为gc):是负责回收内存中无用的对象(好像地球人都知道),就是这些对象没有任何引用了,它就会被视为:垃圾,也就被干掉了。

类装载子系统

  • 一听名字,大家就知道,肯定是用于操作我们编译好的.Class文件的系统,他作用如下:
  1. 定位和导入二进制class文件
  2. 验证导入类的正确性
  3. 为类分配初始化内存
  4. 帮助解析符号引用

执行引擎(Execution Engine)

  • 执行包在装载类的方法中的指令,也就是方法

运行区数据

  • 如上图:虚拟机内存或者Jvm内存,冲整个计算机内存中开辟一块内存存储Jvm需要用到的对象,变量等,运行区数据有分很多小区,分别为:方法区,虚拟机栈,本地方法栈,堆,程序计数器

Jvm运行时数据区

程序计数器

  • 当前线程执行字节码的信号指示器,线程是私有的,它的生命周期和线程相同分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。

虚拟机栈

  • Java虚拟机栈描述的是Java方法(区别于native的本地方法)执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动作链接、方法出口等信息。
  • 线程私有,生命周期和线程相同,都有各个独立的计数器,各不影响。
  • 每个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

本地方法栈

  • 和虚拟机方法栈差不多类似,但是本地方法栈是服务于虚拟机所使用到的Native方法服务

本地方法区

  • 只是执行Native 方法。
  • 如果这个区的内存不足也是会抛出StackOverflowError 和OutOfMemoryError 异常。

JVM中的堆和栈

  • JVM是基于堆栈的虚拟机.JVM为每个新创建的线程都分配一个堆栈.也就是说,对于一个Java程序来说,它的运行就是通过对堆栈的操作来完成的。堆栈以帧为单位保存线程的状态。JVM对堆栈只进行两种操作:以帧为单位的压栈和出栈操作。
  • 堆和栈的差异
1.堆内存用来存放由new创建的对象和数组。
2.栈内存用来存放方法或者局部变量等
3.堆是先进先出,后进后出
4.栈是后进先出,先进后出
  • 堆和栈的相同
1.都是属于Java内存的一种
2.系统都会自动去回收它,但是对于堆内存一般开发人员会自动回收它

JVM、JRE和JDK

JRE

  • JRE是JavaRuntimeEnvironment,java运行时环境,它是java程序运行所必须的环境集合,主要由java虚拟机、java平台核心类和若干支持文件组成。其不包含开发工具、编译器、调试器以及其他工具。

JDK

  • JDK是Java Development Kit,简称java开发工具包。
  • JDK是java的核心。它包括java运行环境、一堆java工具盒java基础的类库(rt.jar)。
  • JDK包含JRE的全部内容外,还包含开发者用以编译、调试和运行java程序的工具。

JDK、JRE、JVM之间的关系

  • JDK、JRE、JVM之间是包含关系。范围由大到小依次为JDK、JRE、JVM。

参考文档: [1] Java程序的运行机制和JVM https://www.cnblogs.com/FocusIN/p/5720881.html
[2] 谈谈java的运行机制 https://www.cnblogs.com/iwinson/p/6074885.html
[3] Java Jvm运行机制原理 http://blog.csdn.net/u011546655/article/details/52175550
[4] Java 堆和栈的区别 http://blog.csdn.net/u011546655/article/details/52170470