【JVM虚拟机】第一篇:初始JVM

1.什么是JVM

JVM全称是Java Virtual Machine ,我们中文翻译过来叫做Java虚拟机或者JVM虚拟机。
JVM本质上是一个运行在电脑上的一个软件,他做的主要任务就是运行Java源代码编译出来的字节码文件。
【JVM虚拟机】第一篇:初始JVM_第1张图片
我们编译出来的源代码,首先使用java提供的jdk中javac编译成.class后缀的字节码文件,这个文件实际上并不能被系统加载并运行,而是需要通过jvm进行解释成计算机机器码才能够运行,也就是说jvm实际上就是充当一个翻译官的操作,如果一个翻译官会10国语言,那么你的对翻译官说的语言,能够让10国人听懂。这也是我们java语言的一个常说的特性:“一次编译,处处运行”;这里运行指的是能够将字节码文件解释成不同系统能执行的机器码。

2.JVM功能

  1. 解释运行: 对字节码文件中的指令,实时的解释成机器码,让计算机执行,字节码文件中,包含了字节码指令,计算机无法直接执行,java虚拟机会将字节码文件中的字节码指令实时解释成机器码,机器码是计算可以执行的指令。
  2. 内存管理:自动为对象、或者方法等分配内存。自动的垃圾回收机制,回收已经不再使用的对象,java虚拟机会帮助程序员为对象分配内存,同时将不用的对象使用垃圾回收器回收掉,这对比c和C++这些语言的一个优势,在C/C++语言中,对象的回收需要程序员手动去编写代码完成,如果遗漏了这段删除对象的代码这个对象会永远的占用内存空间,不会再回收,除非我们关闭程序。所以JVM的这个功能降低了程序员的编写代码的难度。类似于:扫地机器人,可以将我丢的垃圾进行回收掉,但是C、C++没有这个功能,需要我们自己去收拾,你丢的垃圾你自己捡起来。
  3. 即时编译:在程序运行过程中,Java虚拟机需要将字节码指令实时地解释成计算机能识别的机器码,这个过程在运行时可能会反复地执行,所以效率较低。在jdk1.1中,进行一个优化方案,为什么这样优化?我们以现实生活中举例,一个老板有一个翻译官,翻译官会10国语言,这个老板就相当于有了10国语言的能力,但是有一个缺点,就是老板进行对话的过程中,需要翻译官把话翻译成对应的语言,这样才行。这就浪费了时间。后来老板就聪明了,直接先将需要给别人说的核心内容的话,直接给翻译官说,翻译官提前翻译好,到时候直接给对方说,这样是不是就直接提高了效率,jvm虚拟机优化也是这样,先将核心的字节码文件翻译成机器看得懂的语言,放在内存中,程序执行的时候直接去运行。这样Java通过即时编译器获得了接近C/C++语言的性能,在某些特定的场景下甚至可以实现超越。相比于C/C++而言,人家没有秘书,但是人家跟自己国家的人交流,直接交流就行了,但是如果要去其他国家,老板就没办法了,老板必须自己去学会其他国家的语言。

3.常见的JVM虚拟机

JVM虚拟机有很多款,就类似于翻译官很多其他技能,有的翻译官会跳舞蹈,有的会耍猴,有的会干其他事,JVM虚拟机也是一样的,JVM虚拟机在原来的翻译的基础上,实现了其他技能,有了其他特性,就比如你想要一个会开车并会翻译的翻译官。常见的JVM虚拟机有:
【JVM虚拟机】第一篇:初始JVM_第2张图片
也就是说这些JVM虚拟机都满足Java虚拟机的开发规范,类似于各类翻译官,都会翻译一样。
并且JVM虚拟机不仅可以服务老板(java),还可以服务其他人(python),但是他们都需要满足class字节码(语言的)的规范。
最为常用的就是HotSpot,聊一下发展历程:

  • 初出茅庐 - 1999年4月
    源自1997年收购的SmallTalk语言的虚拟机,HotSpot虚拟机初次在JDK中使用。在JDK1.2中作为附加功能存在,JDK1.3之后作为默认的虚拟机。
  • 野蛮生长 - 2006年12月
    JDK 6发布,并在虚拟机层面做了大量的优化,这些优化对后续虚拟机的发展产生了深远的影响。
  • 稳步前进 - 2009-2013
    JDK7中首次推出了G1垃圾收集器。收购了Sun公司之后,吸纳了JRockIt虚拟机的一些设计思想,JDK8中引入了JMC等工具,去除了永久代。
  • 百家争鸣 - 2018-2019
    JDK11优化了G1垃圾收集器的性能,同时推出了ZGC新一代的垃圾回收器,JDK12推出Shenan-doah垃圾回收器。
  • 拥抱云原生 - 2019-至今
    以Hotspot为基础的GraalVM虚拟机诞生,不仅让解决了单体应用中多语言整合的难题,同时也提升了这些语言运行时的效率。极高的性能、极快的启动速度也更适用于当下的云原生架构。

你可能感兴趣的:(JVM虚拟机,jvm)