(:最近在看尚硅谷的JVM教程,把学到的知识点总结一下,让舍友看完也懂JVM。

尚硅谷2020最新版宋红康JVM教程 结合****看更容易懂。

废话少说,立即开冲。
让宝贝舍友理解JVM 第一弹(JVM简介)

JVM简介

1.什么是JVM:

Java技术的核心就是JVM,因为所有的Java程序都运行在JVM内部。

JVM全称是Java Virtual Machine(Java虚拟机),Java的 "write once,run anywhere."就是因为有JVM的存在,让Java在不同平台上运行时不需要重新编译。
让宝贝舍友理解JVM 第一弹(JVM简介)

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

让宝贝舍友理解JVM 第一弹(JVM简介)

从上图可以看出,JVM是运行在操作系统之上的,它与硬件没有直接的交互。

2.JVM的特点?

一次编译,到处执行

自动内存管理

自动垃圾回收功能

3.目前JVM有哪些?

HotSpot VM是绝对的主流。(Oracle官网下载的JDK自带就是这款虚拟机)

JDK8的HotSpot VM已经是以前的HotSpot VM与JRockit
VM的合并版,也就是的“HotRockit”,只是产品里名字还是叫HotSpot VM。

J9 VM是IBM开发的一个高度模块化的JVM。

BEA JRockit:(BEA 已被Oracle收购) 专注于服务端应用,世界最快的jvm之一。

Taobao JVM: 目前已经在淘宝、天猫上线,替换了Oracle官方JVM。

Graal VM: Oracle 2018年4月公开,口号 Run Programs Faster Anywhere.最可能替代HotSpot的产品。

JVM的体系结构:

1.Java代码的执行流程:

让宝贝舍友理解JVM 第一弹(JVM简介)

2.JVM的整体结构:

让宝贝舍友理解JVM 第一弹(JVM简介)

ClassLoader类加载器

Java程序(class文件)并不是本地的可执行程序。当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java class加载到JVM里头运行,负责加载Java class的这部分就叫做ClassLoader。

Class Loader只管加载,只要符合文件结构就加载,至于说能不能运行,则不是它负责的,那是由Execution Engine负责的。

Runtime data area运行数据区

用于保存java程序运行过程中需要用到的数据和相关信息;经常说的把数据读到内存,包括类加载之后的信息,从磁盘读取文件信息等,是JVM的重点。

Execution Engine 执行引擎

执行引擎是java虚拟机的最核心组件之一。

执行引擎也叫做解释器(Interpreter),负责解释命令,提交操作系统执行。它负责执行虚拟机的字节码。现代虚拟机为了提高执行效率,会使用即时编译技术将方法编译成机器码后再执行。

JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM锁识别的字节码指令、符号表和其他辅助信息。

那么,如果想让一个Java程序运行起来、执行引擎的任务就是将字节码指令解释/编译为对应平台上的本地机器指令才可以。简单来说,JVM中的执行引擎充当了将高级语言翻译为机器语言的译者。

Native Interface本地接口

Java Native Interface 简称 JNI。

JNI 使得一些"过程"无需在Java中实现。例如,硬件敏感的,或者直接与操作系统API关联的命令。

应用无法完全用Java编程语言实现的时候,(例如,标准Java类库不支持的特定平台特性或者程序库时),JNI使得编程者能够编写native方法来处理这种情况

在一个Java应用程序中,我们可以使用我们需要的C++类库,并且直接与Java代码交互,而且在可以被调用的C++程序内,反过来调用Java方法(回调函数)。

具体交互图:

让宝贝舍友理解JVM 第一弹(JVM简介)

JAVA虚拟机规范:

Java语言和Java虚拟机有着密切的联系,但两者是完全不同的内容。
Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成。

Java虚拟机规范的主要内容大概有以下几个部分:

  • 定义了虚拟机的内部结构
  • 定义了虚拟机执行的字节码类型和功能
  • 定义了Class文件的结构
  • 定义了类的装载、连接和初始化

有兴趣的同学可以去看看 oracle官方的JVM规范

JVM的生命周期:

JVM实例的诞生

当一个程序启动,伴随的就是一个JVM实例的诞生。
如果在同一台机器上运行多个程序,将诞生相应数量的jvm实例,每个程序都有一个与之对应的Jvm实例供其运行。
任何一个拥有公开的(public)、静态的(static)、没有返回值(void)并且接受一个字符串数组参数(String[] args) 的main()函数的class都可以作为JVM实例运行的起点 。

JVM实例的运行

JVM内部有两种线程:守护线程和非守护线程。

main()属于非守护线程,守护线程通常由JVM自己使用,Java程序也可以标明自己创建的线程是守护线程。

Java程序的初始线程 只就是运行main()的线程,这个线程是非守护线程,只要还有任何非守护线程还在运行,那么JVM就存活着。

有兴趣理解守护线程和非守护线程的同学可以看看下面的博客

简单理解Java的守护线程和非守护线程

JVM实例的退出

让宝贝舍友理解JVM 第一弹(JVM简介)

JRE/JDK/JVM是什么关系?

  • JRE(JavaRuntimeEnvironment,Java运行环境),也就是Java平台。所有的Java程序都要在JRE下才能运行。普通用户只需要运行已开发好的java程序,安装JRE即可。 JDK(Java DevelopmentKit)是程序开发者用来来编译、调试java程序用的开发工具包。
  • JDK的工具也是Java程序,也需要JRE才能运行。为了保持JDK的独立性和完整性,在JDK的安装过程中,JRE也是
    安装的一部分。所以,在JDK的安装目录下有一个名为jre的目录,用于存放JRE文件。
  • JVM(JavaVirtualMachine,Java虚拟机)是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java语言最重要的特点就是跨平台运行。使用JVM就是为了支持与操作系统无关,实现跨平台。

(:整理不易,点个赞不过分吧,球球你们了,这对我真的很重要。
------如有错误,敬请指出。

让宝贝舍友理解JVM 第一弹(JVM简介)
————————————————————————————
参考资料:
https://www.iteye.com/blog/wsqwsq000-1120670
https://www.cnblogs.com/549294286/p/3915691.html
https://blog.csdn.net/qq_34996727/article/details/80684788
https://www.cnblogs.com/longfurcat/p/9830129.html
https://www.bilibili.com/video/BV1PJ411n7xZ?

相关文章:

猜你喜欢
  • 2021-06-16
  • 2021-11-12
  • 2021-05-30
  • 2021-10-11
  • 2021-04-17
  • 2021-10-13
  • 2021-08-30
相关资源
相似解决方案