Java开发必备技能——Java虚拟机

Posted Java联盟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java开发必备技能——Java虚拟机相关的知识,希望对你有一定的参考价值。


Java开发必备技能——Java虚拟机
Java开发必备技能——Java虚拟机


不知道小伙伴们对于Java虚拟机这个概念了解多少呢?今天我们就来了解并且学习一下吧~


首先,我们要明确一点,我们为什么要学习Java虚拟机呢?学习Java虚拟机有什么好处?


Java开发必备技能——Java虚拟机

C++程序编译后可直接运行于物理机CPU上,而Java程序则不同,它是运行在Java虚拟机上。写C++程序的时候,程序员需要自己分配内存和回收内存,一不小心很容易出现内存泄漏错误。写Java程序则不必担心内存的分配和回收,内存的分配和回收全权由Java虚拟机代理,大大降低了内存泄漏的机率。

日常Java开发中,一旦出现OutOfMemory错误,如果对Java虚拟机不熟悉的话,就很难下手调试这个问题。只能对着BUG搔首挠耳,百思不得其解了。所以学习Java虚拟机就很有必要。


而且在我看来学会JVM有以下几个好处:


  • 一览无余地看到Java代码是如何运行的

  • 能够清晰的了解并解决内存溢出、内存泄漏问题

  • 了解Java程序是如何被执行且优化的


Java虚拟机概念


Java虚拟机(Java Virtual Machine 简称JVM)是运行所有Java程序的抽象计算机,Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。


Java虚拟机特点


Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。


Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。


Java开发必备技能——Java虚拟机


在Java运行阶段,获取到保存的.class字节码文件以及源程序中引用的类库Java API的字节码文件,然后通过类装载器(Class Loader)将这些文件一并装载到内存缓冲区,接着Java虚拟机开始执行这些文件并生成目标代码(字节码)。


由于Java虚拟机可以将字节码程序跟具体的操作系统及硬件平台分割开来,只要各平台实现了Java虚拟机,任何Java程序就可以在其上面运行了。


Java开发必备技能——Java虚拟机



JVM 具体是如何工作的?


JVM被划分为三个主要的子系统:


  • 类装载子系统(Class Loader Subsystem)

  • 运行时数据区(Runtime Data Area)

  • 执行引擎(Execution Engine)


类装载子系统


Java的动态类装载功能由类装载子系统来实现。它可以装载,链接,还有当它在运行时(而不是编译时)第一次引用类时,进行初始化类文件。


装载:这个组件功能是加载类。总共有三种类装载器:


Boot Strap class Loader:负责从 bootstrap classpath加载类,在基础类库rt.jar中,具有最高的优先级类装载器。


Extension class Loader:负责加载ext文件夹(jrelib)中的类。


Application class Loader:负责加载应用程序级类Class Path、Path和环境变量等。


上面的类加载器在加载类文件时,将遵循 Delegation Hierarchy Algorithm 算法。


链接Linking


验证Verify:字节码验证器将验证生成的字节码是否正确,如果验证失败,我们将得到验证错误。


准备Prepare:对于所有静态变量,内存将被分配并分配默认值。


解析Resolve:所有符号内存引用都替换为来自方法区域的原始引用。


初始化Initialization


这是类装载的最后一个阶段,在这里所有静态变量都将被赋与原始值,静态代码块将被执行。


运行时数据区


运行时数据区域分为5个主要部分:


方法区域(Method Area):所有的类级别数据都将存储在这里,包括静态变量。每个JVM只有一个共享的方法区域。


堆区域 (Heap Area):所有对象及其对应的实例变量和数组都将存储在这里。每个JVM也只有一个堆区域。由于方法和堆区域为多个线程共享内存,所以堆区存储的数据并不是线程安全的。


栈区域(Stack Area):对于每个线程,将创建一个单独的运行时栈。对于每个方法调用,将在堆栈内存中创建一个条目,称为堆栈帧(Stack Frame)。所有本地变量都将在栈内存中创建。栈区域是线程安全的,因为它不是共享资源。


堆栈框架分为三个子实体:


局部变量数组(Local Variable Array):与方法相关的局部变量以及相应的值将存储在这里。


操作数堆栈(Operand stack) –如果需要执行任何中间操作,操作数堆栈作为运行时工作区来执行操作。


Frame data – 与方法对应的所有符号都存储在这里。异常处理中,Catch块信息将在框架数据中维护。



本地方法栈(Native Method stacks ):–本地方法栈保存本地方法的信息。为每一个线程,将创建一个单独的本地方法栈。


执行引擎


分配给运行时数据区域的字节码将由执行引擎执行。执行引擎读取字节码并逐个执行它。


Interpreter:解释器解释字节码很快,但执行缓慢。解释器的缺点是,当一个方法被多次调用时,每次都需要新的解释。


JIT Compiler:JIT编译器消除了解释器的缺点。执行引擎将使用解释器的帮助来转换字节代码,但是当它发现重复的代码时,它使用JIT编译器,它编译整个字节码并将其更改为本机代码。这种本机代码将直接用于重复的方法调用,从而提高系统的性能。


Intermediate Code generator:生成中间代码


Code Optimizer:负责优化上面生成的中间代码


Target Code Generator:负责生成机器代码或本机代码


Profiler:一种特殊的组件,负责查找hotspots,即该方法是否被多次调用。


垃圾回收:收集和删除未引用的对象。可以通过调用“System.gc()”来触发垃圾收集,但不会立即执行(执行时机由GC决定)。JVM的垃圾回收收集已创建的对象。


Java Native Interface (JNI):JNI将与本地的方法库交互并为执行引擎提供所需的本地库。


Native Method Libraries:它是执行引擎所需的本地库的集合。


Java开发必备技能——Java虚拟机


 Java开发必备技能——Java虚拟机

今天的文章就到这啦

小伙伴有学会嘛

欢迎大家点赞收藏

分享转发

一起交流吧Java开发必备技能——Java虚拟机


▼▼▼

Java开发必备技能——Java虚拟机

-END-



六步教你学会用Java生成二维码


系统水印不好看?那就自己开发吧


以上是关于Java开发必备技能——Java虚拟机的主要内容,如果未能解决你的问题,请参考以下文章

你真正了解Java虚拟机吗—高级开发必备《深入了解Java虚拟机》

Java 虚拟机内存区域划分详解

浅读Java虚拟机

浅读Java虚拟机

深入理解java虚拟机GC垃圾回收-虚拟机及垃圾收集器日志参数总结

面试必备-Java虚拟机内存管理必知必会