当前位置:首页>Java>JVM虚拟机>JVM教程

JVM教程

作者:微学网发布时间:2019-08-11 14:11:23

什么是JVM

定义

Java虚拟机(Java Virtual Machine 简称JVM)是运行所有Java程序的抽象计算机,是Java语言的运行环境,它是Java 最具吸引力的特性之一。

JVM是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域等组成。

JVM屏蔽了与操作系统平台相关的信息,使得Java程序只需要生成在Java虚拟机上运行的目标代码(字节码),就可在多种平台上不加修改的运行,这也是Java能够“一次编译,到处运行的”原因。

简介

虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。

Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。

Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

JVM(Java虚拟机)管理着计算机系统内存,并为基于Java的应用程序提供可移植的执行环境。

Java虚拟机本质上也是一个计算机应用程序,其目的是执行其他Java语言编写的程序。正是由于这种特性,Java语言可以实现跨平台的特性,达到write once,run anywhere的效果。

JVM两个主要功能

  • 1)允许Java程序在任何设备或操作系统上运行(称为“一次写入,随处运行”原则)

  • 2)管理和优化程序使用内存。

当Java于1995年第一次发布时,当时所有计算机程序都被写入特定的操作系统,程序内存由软件开发人员来分配和管理。所以JVM相当于是一次变革。

JVM特点

Java语言的一个非常重要的特点就是与平台的无关性。

而使用Java虚拟机是实现这一特点的关键。

一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。

而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。

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

Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。

JVM组成

JVM规范

JVM是一个软件规范。为了使它的实现发挥尽可能大的创造力,JVM规范用一种有点写意的方式指明它的实现细节并不包含在规范内。

因此,JVM所需要去做的就是使Java程序正确地运行。听起来很简单,也许从外部看起来确实很简单,但实际上这是一项大的工程,尤其是你还要赋予给Java语言强大的功能和灵活性。

JVM实现

实施JVM的规范开发出一个真实的软件程序,我们称之为JVM实现。

事实上,目前已经有很多JVM实现,开源闭源的都有。

OpenJDK的HotSpot是一个作为参考的实现,它保留着全世界最全面的尝试和测试代码库。

HotSpot同时也是最普遍使用的JVM。

几乎所有获得许可的JVM都是从OpenJDK和HotSpot JVM衍生而来,包括Oracle发行的JDK。

开发者们根据OpenJDK创造一个许可的虚拟机通常是因为渴望去获得面向特定操作系统的性能提升。

比如,你下载的JVM作为Java运行时环境的一部分就和操作系统密切相关联。

JVM实例

在JVM规范被实现和作为一个软件产品发行后, 你可以把它作为一个程序下载和运行它。

这个下载的程序就是一个JVM实例(或者称为实例化的版本)。

大多数情况下,当开发者们谈到“JVM”,我们指的是运行在开发过程或生产环境中的JVM实例。

你可能会说,“那台服务器上JVM用了多少内存”,或者,“难以置信我创造了一个循环调用导致了栈溢出错误直接把JVM搞崩溃了,这真是个是新手才犯的错误啊!”。

为什么要学习JVM

1. 程序调优

不同的程序(业务场景)需要不同的Jvm配置,比如设置不同的垃圾收集器、设置新生代和老生带的内存配置和占比等,不同的配置对于程序的运行有着千差万别的影响。而Jvm默认的配置只能保证程序能够“运行”,而想要“很好的运行”甚至是“更好的运行”,就是学习Jvm最主要的因素之一。

2. 排查程序运行问题

有些程序可能在线上使用的时候会遇到各种各样的问题,而这些问题通常都是致命的,比如内存溢出,死锁导致的程序运行缓慢等,而这些问题在开发和小量并发测试阶段是很容易被忽略的缺陷,所以学习好了Jvm才能在关键的时候,临危不乱帮你扫除系统中的“顽疾”。

3. 掌握了程序执行的根本和原理

也就是很多人说的:不但要“知其然”,还要“知其所以然”。

4. 规避写代码时候的一些错误

比如避免重载可变长参数的调用(后面文章会给出具体的案例)。

5. 应付面试

不得不说这也是很多人学习的目的之一,当然这也是积极的推动力,如果你明白“鲶鱼效应”的话。

6. 掌握了其他语言的通用机制

JVM还有一个强大之处是,它不止可以运行Java程序,还可以运行Scala、Clojure、Groovy,以及时下热门的 Kotlin,学习JVM便可以了解这些语言的通用机制,甚至于让这些语言共享生态系统。

如何有效的学习JVM教程

JVM的知识点,主要学习如下几个部分

1. JVM的组成

只有了解了JVM的组成部分,才能算的上真正的了解了JVM,JVM的组成5个部分:堆、虚拟机栈、本地方法栈、程序计数器、方法区,后面文章会分别介绍5个部分的具体用途。

2. 多种垃圾回收算法

Jvm中有很多垃圾回收算法,不同的算法优缺点也各不相同,比如:标记清除算法和复制算法、标记清楚算法会产生多种空间碎片、复制算法把内存分为两块,性能虽然很好但是每次只能使用一块,又浪费了内存的空间,那有没有相对完美的算法呢?答案肯定是有的,由于篇幅的原因,后面文章会详细讲解。

3. 多种垃圾收集器

Jvm的垃圾收集器有很多,比如最早版本的串行收集器Serial,发展历史最悠久的收集器,它是采用复制算法的新生代收集器,它是一个单线程收集器,它在进行垃圾收集时,必须暂停其他所有的工作线程,直至Serial收集器收集结束为止(“Stop The World”)。还有CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器;还有比较前沿的G1(Garbage-First)收集器等。

学习这些收集器,一方面是为自己程序配置合适的收集器,另一方面是每个收集器的设置参数都不相同,学习了这些收集器的配置之后,可以为程序设置最优的运行匹配参数。

4. JVM分析工具

Jvm的分析工具用于排查程序运行的缺陷,找出程序的问题所在,从而保证程序的稳定运行,Jvm分析器分为:命令行工具(官方称之为实验性质的工具,但稳定性是不容置疑的),还有视图分析工具,前者当然优于后者,但后者是建立在前者的基础上的,本系列后面会详细的把每个工具进行深入的讲解。

5. Java类加载机制

Java类加载机制,讲的是Java的类在Jvm中的加载以及运行机制,对于认识Java是怎么运行的有着非常大的帮助,这也是学习Java非常有趣的一点,你可以看到Java运行的整个过程,是完全透明化的,给人一种“掌控感”,这是Java语言天生支持的,所以会觉得Java这门语言很有趣。

6. JVM常用优化配置

学习Jvm收益最大的其实就是,使用Jvm的这些常用配置,让你的程序运行的更高效,所以对于这方面的学习是必不可少的。

JVM的发展:过去、现在、未来

1995年,JVM的问世带来了两个革命性的概念,成为了现代软件发展的标准进化方向:“一次编写,到处运行”以及自动的内存管理。

软件的互通性在那时是个大胆的概念,但在今天极少的开发者还需要去考虑它。

类似地,软件前辈们不得不自己管理内存,而我们这一代是在垃圾收集的概念中成长的。

我想说James Gosling (Java发明者)和Brendan Eich(Javascript发明者)发明了现代编程,但在后来的几十年,成千上万的后来者在它们的想法基础上,进行了重新定义和构建。

尽管JVM最初只是为Java使用,但在今天它已经进化成可以支持众多脚本和编程语言,包括Scala, Groovy, 和Kotlin。往前看,很难看到一个JVM不是重要部分的未来。