深入理解JVM:Java语言与JVM关系

在那个电闪雷鸣,群鸟环绕的夜晚,一个不为人知的语言Oak诞生了,此时正值1991年4月份,气温舒适,百花齐放。然而Oak的诞生并没有得到人们的关注,直到1995年5月23号,Oak决定正是更名为Java,并喊出了 “Write Once,Run Anywhere”(一次编写,随处运行)的口号,真是一语惊天雷,从此震乾坤。

Java语言概述

Java语言作为世界上最为流行且用户使用量最多的语言,由当时的懵懂无知的小鲜肉,已然成为了现在的稳重成熟的老油条。他怀揣梦想,肩负使命,不断在信息化的时代披荆斩棘,破浪前行。

Java语言发展史

年代 Java版本
1995年5月 Oak正式更名为Java
1996年1月 JDK1.0正式发布
1997年2月 JDK1.1正式面世
1998年12月 第二代Java平台发布
1999年4月 HotSpot虚拟机发布
2000年5月 J2SE1.3发布
2002年2月 J2SE1.4发布
2004年9月 J2SE1.5发布
2005年6月 Java SE 6发布
2011年7月 Java7正式发布
2014年3月 Java8正式发布
2017年5月 Java9正式发布
2018年3月 Java10正式发布
2018年9月 Java11正式发布
2019年3月 Java12正式发布
2019年9月 Java13正式发布
2020年3月 Java14正式发布
2020年9月 Java15正式发布

通过上表,可以得知,Java语言发展之迅猛,而且Java语言全球的流行度依旧排名前几,并且用户的黏性是居高不下。从Java8以后,基本上每年都有新版本的更新发布。从2019年1月起,Java8不再支持更新,进入“End of Public Updates”,至此以后,也将进入收费模式。

几个相关的名词解释

JDK:Java开发工具包。是一个编写Java的Applet小程序和应用程序的程序开发环境。JDK是整个Java的核心,包括了Java运行环境(Java Runtime Environment),一些Java工具和Java的核心类库(Java API)。
JRE:Java运行时环境,也就是运行Java程序所需要的标准环境。
JVM:Java虚拟机。可以看做是一个虚拟的计算机,也是Java实现跨平台最核心的部分。它屏蔽了操作系统与平台的相关信息,使得Java语言能够不依赖平台而运行,也可以说只要有JVM存在的地方,就能运行Java语言程序。
那么上面的几个有什么关系呢?
深入理解JVM:Java语言与JVM关系_第1张图片

JVM的重要性

一句话可以说明一切:实现跨平台。Java语言的梦想就是“一次编译,随处运行”。这句话可不是随便说说就行了,必须要有可靠的平台和技术支撑,那么JVM就是这一豪言壮语的重要保障。如果没有JVM,Java语言可能早已成为历史,被无情的淹没掉。
深入理解JVM:Java语言与JVM关系_第2张图片
从上图也可以看出,Java语言之所以跨平台,真是因为JVM的功劳,不同操作系统有不同的JVM实现。并不是真正意义上的跨平台,毕竟各个操作系统的特性及指令集不同,所以必须有不同的JVM来解决这一问题。

JVM的组成部分

深入理解JVM:Java语言与JVM关系_第3张图片
class文件被类加载系统加载到JVM中后,JVM会将数据划分到不同的区域,这些区域分工协作,共同完成Java程序的数据运行工作。
这里简要解释一下各个数据区域的功能职责,后续将会进行完备且详尽的介绍。

程序计数器

程序计数器是JVM中一块较小的内存区域,是当前线程执行的字节码行号指示器。在虚拟机的概念模型里,字节码解释器工作就是通过改变这个计数器来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基础功能都需要依赖程序计数器来完成。
每个线程都有自己独立的程序计数器,各线程之间的程序计数器互不影响,独立存储,所以是线程私有的内存区域
如果线程执行一个java方法,则程序计时器记录的是正在执行的虚拟机字节码指令的地址,如果执行的是native方法,则计数器的值则为空(Undefined)。
此区域是Java虚拟机规范中唯一一个没有规定任何OOM情况的区域

虚拟机栈

虚拟机栈也称Java虚拟机栈或者帧栈,是线程私有的一块区域,并且生命周期与线程同生共死。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每个方法从调用到执行完成,都对应着栈帧的入栈和出栈过程。

本地方法栈

本地方法栈与虚拟机栈发挥的作用非常相似,只不过虚拟机栈为虚拟机执行Java方法(Java字节码)提供服务,而本地方法栈为虚拟机使用到的Native方法服务。有的虚拟机甚至将本地方法栈与虚拟机栈合二为一。

方法区

方法区和Java堆一样,是各个线程共享的内存区域。用于存储已经被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。

Java堆是Java虚拟机所管理的内存中最大的一块内存区域,并且这块内存区域是所有线程所共享的,在虚拟机启动的时候创建。此区域唯一的目的就是存放对象实例。Java堆也是垃圾收集器管理的主要区域,也被成为:GC堆。

为什么要学习JVM

  1. 面试需要。
    作为一个Java工程师,如果对于JVM原理不甚了解的话,那就不是一名合格的Java工程师,如果想晋升高级Java工程师或者架构师,更需要对JVM的原理了如指掌,深入骨髓。而且一线大成的面试中,JVM的知识必问,必问,必问。更深入的理解并掌握JVM的相关知识,那么应对其相关面试就会手到擒来,游刃有余。
  2. 更深入的理解java语言及其运行机制。
    知其然,也要知其所以然,我们亲手写的程序,都不知道是如何运行,内存如何分配,垃圾如何回收,那么可以说是非常的不合格,只有真正的掌握了JVM虚拟机的知识才能站在上帝视角,对程序的运行原理胸有成竹。
  3. 排查解决线上故障与问题。
    当线上频繁FGC怎么办,当线上出现OOM怎么办。拥有解决这些故障和问题的能力,必须对JVM及其辅助工具做到拿来即用的熟悉程度。所以一名优秀的工程师,最突出的能力就是解决线上问题的能力,相信代码都会写,但是出现问题可不一定都会解决。
  4. 性能调优。
    学习JVM的终极目的,就是让我们的程序能飞一般的运行,这就离不开虚拟机的性能调优,那么如何分配内存,如何设置垃圾收集算法,如何跟踪程序运行情况,都离不开JVM的理论知识。而且性能调优也能考验一个资深工程师的自身能力。

以上对Java语言和Jvm做了大致的了解,后面将会详细介绍JVM的各个组成部分,以及相关的知识。

你可能感兴趣的:(JVM基础与原理,jvm)