Java - java虚拟机概述、jre, jdk, jvm的区别

  • Java虚拟机概述

    • Java推出时,提出了 "Write Once,Run Anywhere" 的口号,能达到跨平台运行代码这件事,就必须归功于java虚拟机 (Java Virtual Machine)的功劳了

      • 传统C/C++是直接把程序员写的.c/.cpp代码,编译成那个平台(ex: Windows)能看懂的machine code,所以当编译一次之后,生成出来的这些machine code,只能够在Windows上运行而已,如果要换到另一种平台Linux上运行的话,必须再次将程序员的.c/.cpp代码,编译成Linux版本的machine code,所以C/C++才无法跨平台运行

        • 要知道重新编译的代价是很高的,当程序很小的时候编译可能只需要几秒,但是当程序很大时,一次编译可能需要几个小时

      • 而Java之所以能作到跨平台则是因为他在中间又多加了一层,也就是会把程序员所写的.java代码,编译成java bytecode(可以把这个bytecode看做是一种全新的语言),而在不同平台上安装该平台相对应的jvm,jvm可以看懂bytecode,并将bytecode转译成该平台看得懂的machine code,如此就达到了跨平台

        • 之所以说java是可以跨平台运行的语言,是因为他编译一次之后,就可以拿著这份bytecode到处跑,不用换个平台就要重新编译一次换份bytecode,也就是说只要代码编译一次之后,就可以一直使用

    • 有一点要特别注意,Java虚拟机虽然全名叫做 Java Virtual Machine,但他其实跟Java一点关系都没有

      • 当Java虚拟机在执行时,他所认识的是已编译成bytecode的.class,他唯一的工作就是负责把这些.class转换成该平台看得懂的machine code

        • 因此对Java虚拟机来说,这个.class文件是不是从Java编译过来的一点都不重要,他在意的只是这些.class档有没有按照bytecode的规则写而已,所以假设你够厉害,直接写.class bytecode给jvm运行也是可以的

        • 也就是说,如果我们为另一种语言制定了此语言专属的bytecode编译器,使得此bytecode编译器可以将此语言编译成.class,那麽此语言同样也可以运行在jvm上

      • 早在Java刚发展时,设计者就曾经考虑过让其他语言运行在java虚拟机上的可能性,他们在发表规范文档时,也刻意的把Java的规范拆分成了 "Java语言规范" 和 "Java虚拟机规范",而实际上,目前确实已经有许多其他的语言运行在java虚拟机上了,像是Groovy、Scala、Kotlin...,所以Java虚拟机真的跟Java没啥关系,改叫做 Class Virtual Machine 还贴切一点

    • 总结以上,Java虚拟机拥有两大无关性

      • 平台无关性 : bytecode .class和不同平台的jvm

      • 语言无关性 : 不止能运行java语言,只要别的语言能编译成class bytecode,jvm都能运行

    • 目前java中使用的jvm是HotSpot虚拟机,HotSpot是由于他的热点代码探测技术而得名

      • HotSpot虚拟机的热点代码探测能力可以通过执行计数器,找出最有价值的代码,然后通知 JIT(Just In Time)编译器以方法为单位进行编译

      • 如果一个方法被频繁调用、或是方法中有效循环次数很多,将会分别触发标准编译和OSR(栈上替换)编译动作,透过编译器和解释器的协同工作,可以在最优化的程序响应时间与最佳执行性能中取得平衡

      • 并且HotSpot无须等待JIT把machine code完全输出后才能执行程序,可以先使用解释器执行程序,所以即时编译的时间压力也相对减小,这样有助于引入更多的代码优化计数,输出质量更高的machine code

  • jdk、jre、jvm的区别

    • jvm : Java Virtual Machine,java虚拟机

      • 使java可以跨平台运行的神器

    • jre : Java Runtime Environment,Java执行环境

      • 包括了Java SE api和jvm,只要某台电脑安装了jre,就可以运行java程序

    • jdk : Java Development Kit,Java开发工具,曾被戏称为 Java Developer Killer

      • javac、javadoc这些开发工具,都包含在jdk裡面,所以对于开发java程序的人,必须要安装jdk才能进行开发

    • 简单的说,jdk包括了Java程式语言、工具程式、jre,jre包括了部署技术、Java SE api、jvm

      • 所以开发程式的程序员才需要安装jdk(只要载jdk就会连jre、jvm都包括了),如果是已开发好的程式要给别人运行,那麽只要在别人的电脑上安装jre就可以了

猜你喜欢

转载自blog.csdn.net/weixin_40341116/article/details/86591065
今日推荐