15158846557 在线咨询 在线咨询
15158846557 在线咨询
所在位置: 首页 > 营销资讯 > 网站运营 > 什么是Java虚拟机(JVM)?--------回过头来看

什么是Java虚拟机(JVM)?--------回过头来看

时间:2023-07-02 03:54:02 | 来源:网站运营

时间:2023-07-02 03:54:02 来源:网站运营

什么是Java虚拟机(JVM)?--------回过头来看:

什么是Java虚拟机(JVM)?--------回过头来看



博客说明



文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!



简介



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



Java虚拟机(JVM)一种用于计算机设备的规范,可用不同的方式(软件或硬件)加以实现。编译虚拟机的指令集与编译微处理器的指令集非常类似。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。



Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行。



Java虚拟机规范定义了一个抽象的——而非实际的——机器或处理器。这个规范描述了一个指令集,一组寄存器,一个堆栈,一个“垃圾堆”,和一个方法区。一旦一个Java虚拟机在给定的平台上运行,任何Java程序(编译之后的程序,称作字节码)都能在这个平台上运行。Java虚拟机(JVM)可以以一次一条指令的方式来解释字节码(把它映射到实际的处理器指令),或者字节码也可以由实际处理器中称作just-in-time的编译器进行进一步的编译。



灵魂一问,什么是JVM?



前面说了一大堆,最后啥也记不住,视频看了好多遍,最后还是忘记得干干净净,那到底该怎么来定义这个Java的核心JVM呢?我们来运用我们中华语言的魅力,JVM在我们java语言执行的流程当中到底做了什么?我们给它一种修辞手法。还是拟人吧。它就是一个java语言的专有的随身的且不能离开的翻译



Java的跨平台



在得到答案之后,我们来。来做什么呢?来总结,前面我们说它是一个翻译,那么这个翻译让Java具有了一种魅力——跨平台性,正是多亏了这个牛坏了的翻译,Java在哪个平台都能吃得了,而且吃得开。



那这个JVM是怎么来实现跨平台的呢?



其实在我们的一些平台上的JVM是不同的翻译,但是他们都为Java服务,它把Java程序翻译到各个平台,导致一套代码就可以同时运行在多个平台了。就是每个不同的操作系统的JVM是不同的版本。



讲了这么多不来一张图,搞得我多lao似的







其实这个图并不是那么的好看,但是看了一下在脑海里会有一个印象,这有助于我们理解JVM



两个老J---JRE和JDK



不知道你们怎么读,我们这边读gou,懂得自然懂的哈

JRE简介

Java运行环境(Java Runtime Environment)包含JVM和运行时所需要的核心类库,我们想要运行一个已有的Java程序,那么只需要安装JRE

JDK简介

JDK(Java Development Kit) 是 Java 语言的软件开发工具包,包含JRE和开发人员使用的工具,如果要开发一个全新的Java程序,那么必须安装JDK

JDK版本

SE(JavaSE),standard edition,标准版,是我们通常用的一个版本,从JDK 5.0开始,改名为Java SE。



EE(JavaEE),enterprise edition,企业版,使用这种JDK开发J2EE应用程序,从JDK 5.0开始,改名为Java EE。从2018年2月26日开始,J2EE改名为Jakarta EE [1] 。



ME(J2ME),micro edition,主要用于移动设备、嵌入式设备上的java应用程序,从JDK 5.0开始,改名为Java ME。



没有JDK的话,无法编译Java程序(指java源码.java文件),如果想只运行Java程序(指class或jar或其它归档文件),要确保已安装相应的JRE

JDK的历史图



JDK版本新特性

jdk1.8新特性



Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可。



新增lambda表达式



提供函数式接口



Java 8 允许你使用关键字来传递方法或者构造函数引用



我们可以直接在lambda表达式中访问外层的局部变量。

JDK基础组件

javac – 编译器,将源程序转成字节码



jar – 打包工具,将相关的类文件打包成一个文件



javadoc – 文档生成器,从源码注释中提取文档



jdb – debugger,查错工具



java – 运行编译后的java程序(.class后缀的)



appletviewer:小程序浏览器,一种执行HTML文件上的Java小程序的Java浏览器。



Javah:产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件。



Javap:Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。



Jconsole: Java进行系统调试和监控的工具



JVM、JRE和JDK的关系



刚才好像忽略了什么,这里已经有三个老J(gou)啦。



说它们的关系就是JDK包含JRE包含JVM,直接上图就好







这样就好理解了吧



JVM内存管理



对于Java运行时涉及到的存储区域主要包括程序计数器、Java虚拟机栈、本地方法栈、java堆、方法区以及直接内存等等。对于每个部分,都有其使用的条件。程序计数器主要是取下一条指令,在Java里面主要是取下一条指令的字节码文件;Java虚拟机栈主要是利用栈先进后出的特性存储局部变量表,动态链接等,主要包括堆内存和栈内存,对于程序员内存分析而言是特别重要的。本地方法栈与上边的栈基本作用差不多,只不过这里是为Java方法而服务。Java堆是内存管理中最大的一块,所有的线程共享这一块内容,同时该部分也是垃圾收集器的主要区域。



虚拟机的垃圾回收机制是完善的,动态内存分配和回收是比较成熟的,在内存管理机制中,大部分都不需要我们考虑内存回收,只有Java堆和方法区需要我们考虑处理内存问题。一般的对于内存回收首先就是判断某一个部分是生存还是死亡,主要是通过下面二种算法:



其一是引用计数算法,本算法实现简单,判定的效率也是比较高的,很多的软件都使用了该算法,但是主流的Java并没有选择该算法,核心的问题是该算法难以处理对象之间相互调用的问题。



其二是称可达性分析算法,该算法核心思想是依靠判断对象是否存活来实现的,本算法是通过一系列的GC ROOTS的对象作为起始点,采用搜索的算法遍历引用链,如果搜索过程中没有发现该节点,则认为该节点是不可达的,即可回收的,在Java里面,一般可以使用该算法处理问题。



感谢



百度百科

以及勤劳的自己

微信公众号:归子莫

关键词:虚拟

74
73
25
news

版权所有© 亿企邦 1997-2025 保留一切法律许可权利。

为了最佳展示效果,本站不支持IE9及以下版本的浏览器,建议您使用谷歌Chrome浏览器。 点击下载Chrome浏览器
关闭