什么是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里面,一般可以使用该算法处理问题。
感谢百度百科
以及勤劳的自己
微信公众号:归子莫