深入理解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就是这一豪言壮语的重要保障。如果没有JVM,Java语言可能早已成为历史,被无情的淹没掉。
从上图也可以看出,Java语言之所以跨平台,真是因为JVM的功劳,不同操作系统有不同的JVM实现。并不是真正意义上的跨平台,毕竟各个操作系统的特性及指令集不同,所以必须有不同的JVM来解决这一问题。
JVM的组成部分
class文件被类加载系统加载到JVM中后,JVM会将数据划分到不同的区域,这些区域分工协作,共同完成Java程序的数据运行工作。
这里简要解释一下各个数据区域的功能职责,后续将会进行完备且详尽的介绍。
程序计数器
程序计数器是JVM中一块较小的内存区域,是当前线程执行的字节码行号指示器。在虚拟机的概念模型里,字节码解释器工作就是通过改变这个计数器来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基础功能都需要依赖程序计数器来完成。
每个线程都有自己独立的程序计数器,各线程之间的程序计数器互不影响,独立存储,所以是线程私有的内存区域。
如果线程执行一个java方法,则程序计时器记录的是正在执行的虚拟机字节码指令的地址,如果执行的是native方法,则计数器的值则为空(Undefined)。
此区域是Java虚拟机规范中唯一一个没有规定任何OOM情况的区域。
虚拟机栈
虚拟机栈也称Java虚拟机栈或者帧栈,是线程私有的一块区域,并且生命周期与线程同生共死。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每个方法从调用到执行完成,都对应着栈帧的入栈和出栈过程。
本地方法栈
本地方法栈与虚拟机栈发挥的作用非常相似,只不过虚拟机栈为虚拟机执行Java方法(Java字节码)提供服务,而本地方法栈为虚拟机使用到的Native方法服务。有的虚拟机甚至将本地方法栈与虚拟机栈合二为一。
方法区
方法区和Java堆一样,是各个线程共享的内存区域。用于存储已经被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。
堆
Java堆是Java虚拟机所管理的内存中最大的一块内存区域,并且这块内存区域是所有线程所共享的,在虚拟机启动的时候创建。此区域唯一的目的就是存放对象实例。Java堆也是垃圾收集器管理的主要区域,也被成为:GC堆。
为什么要学习JVM
- 面试需要。
作为一个Java工程师,如果对于JVM原理不甚了解的话,那就不是一名合格的Java工程师,如果想晋升高级Java工程师或者架构师,更需要对JVM的原理了如指掌,深入骨髓。而且一线大成的面试中,JVM的知识必问,必问,必问。更深入的理解并掌握JVM的相关知识,那么应对其相关面试就会手到擒来,游刃有余。 - 更深入的理解java语言及其运行机制。
知其然,也要知其所以然,我们亲手写的程序,都不知道是如何运行,内存如何分配,垃圾如何回收,那么可以说是非常的不合格,只有真正的掌握了JVM虚拟机的知识才能站在上帝视角,对程序的运行原理胸有成竹。 - 排查解决线上故障与问题。
当线上频繁FGC怎么办,当线上出现OOM怎么办。拥有解决这些故障和问题的能力,必须对JVM及其辅助工具做到拿来即用的熟悉程度。所以一名优秀的工程师,最突出的能力就是解决线上问题的能力,相信代码都会写,但是出现问题可不一定都会解决。 - 性能调优。
学习JVM的终极目的,就是让我们的程序能飞一般的运行,这就离不开虚拟机的性能调优,那么如何分配内存,如何设置垃圾收集算法,如何跟踪程序运行情况,都离不开JVM的理论知识。而且性能调优也能考验一个资深工程师的自身能力。
以上对Java语言和Jvm做了大致的了解,后面将会详细介绍JVM的各个组成部分,以及相关的知识。
深入理解JVM:Java语言与JVM关系相关推荐
- 探索Java语言与JVM中的Lambda表达式
2019独角兽企业重金招聘Python工程师标准>>> 转载来源:http://www.admin10000.com/document/1291.html Lambda表达式是自Ja ...
- C语言handle对象对应java,c语言和java语言之间的关系到底是怎么样的,两种 体系?还是一种体系的不同阶段?还是其它的什么?...
在学习JAVA期间感觉JAVA与C语言之间的区别很多,但联系又很大因为它也是C语言的一个分支,JAVA是面向对象的语言,C是面向过程的语言,我认为不能单纯地比较好坏 .在速度上,C语言编写的程序要优于 ...
- jvm(Java virtual machine) JVM架构解释
2019独角兽企业重金招聘Python工程师标准>>> JVM 架构解释 每个Java开发者都知道通过JRE[Java运行环境]执行字节码. 但是很多人都不知道JRE是JVM实现的事 ...
- day01--java基础编程:计算机基础知识 ,java语言概述,java开发环境搭建,eclipse概述,创建简单java项目,JDK JRE JVM的关系,java开发中的命名规范,编程风格
1 Day01–Java开发环境+HelloWorld 1.1 计算机基础知识 资料下载网址:刘沛霞 18600949004 code.tarena.com.cn tarenacode code_20 ...
- java jstack使用_JAVA语言之JVM 中jstack命令使用详解
本文主要向大家介绍了JAVA语言之JVM 中jstack命令使用详解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. Java程序问题定位时线程栈信息是一个重要线索,如下: " ...
- Java虚拟机(JVM)简介
什么是JVM Java虚拟机(JVM)是使计算机能够运行Java程序的抽象计算机. JVM有三个概念: 1.规格 2.实施 3.实例. 该规范是正式描述JVM实现要求的文档. 具有单一规范可确保所有实 ...
- Java基础:01Java语言概述(常见的DOS命令,Java语言的特点、核心机制、环境搭建,HelloWorld,注释,Java API 文档)
Java基础:01Java语言概述 一.常见的DOS命令 二.Java语言的特点 面向对象性 健壮性 跨平台型 三.Java两种核心机制 1. Java虚拟机 2. 垃圾回收 四.Java语言的环境搭 ...
- java语言适合编写什么_01--Java语言概述与开发环境 最适合入门的Java教程
Java程序运行机制 编译型语言: 使用专门的编译器,针对特定平台(操作系统)将某种高级语言源代码一次性"翻译"成可被该平台硬件执行的机器码(包括机器指令和操作数),并包装成该平台 ...
- Java笔记-01(Java语言的特性、JDK、JRE、JVM三者之间的关系和Java重点术语)
1.Java语言的特性 1.1.简单性在Java语言当中真正操作内存的是:JVM(Java虚拟机)所有的java程序都是运行在Java虚拟机当中的.而Java虚拟机执行过程中再去操作内存.对于C或者C ...
最新文章
- ubuntu 下利用ndiswrapper安装无线网卡驱动
- 原来颓废也是需要力气的
- 关于举办第十七届全国大学生智能汽车竞赛的通知-加盖公章
- python解决四舍五入问题
- Flink从入门到精通100篇(四)-基于 Flink 和 Drools 的实时日志处理
- Linux之eval命令使用
- 玩转嵌入式,且看痞子衡
- html文件中用import,@import引入CSS文件
- oracle凭证编号,R12 AP模块的发票过账后如何关联对应的凭证编号
- 轻松调整,提升写作效率,让 Word 更好地为你所用
- 【前端】盒子水平垂直居中的六大妙招
- CSS 3D透视效果 星空穿越
- 3d效果图制作傻瓜软件_装修房子自己做3D效果图,哪些3D室内设计软件比较合适?...
- STM32串口DMA方式发送数据
- java高德地图算距离_根据高德地图得出的坐标算出两点之间的距离 java
- 寺库不再值得认可:违法案例频现,“便宜货”让罗敏和趣店亏惨
- 晒弟弟考取的教资证写的朋友圈文案
- 解决图片处理插件image-conversion压缩后图片底色变黑
- 树莓派接手机屏幕_如何将树莓派连接到手机屏幕
- 智慧交通|沪宜公路智慧车列交通仿真研究
热门文章
- Agronomy|3.9分JCR1区征稿/37天见刊-宏基因组解析农业微生物组专刊(刘永鑫/于鹏)...
- PHP开发常见面试题目
- ubuntu wifi 设备未托管 网络设备不兼容 网络慢
- 3t硬盘哪个服务器系统识别,3T硬盘为何不能被系统完全识别
- 如何选购笔记本电脑?
- C#WinForm 程序退出后,托盘区的图标不能及时消失
- Latex 中导入visio画的图片,去除多余留白
- 系统之家U盘 win10返回桌面快捷键是什么
- 导出datatable到excel然后让web客户端下载到本地
- 如何使用 LK 字幕脚本工具