作为一名Java程序员,你应该知道Java有很多种运行方式.比如说可以在开发工具中运行,可以双击jar包运行,可以在网页端运行.当然这些运行方式都离不开JRE「也就是java运行时环境」.
实际上, JRE仅仅包含了运行Java程序的必须组件, 包括java虚拟机及核心类库等.Java程序员经常使用的JDK「Java程序开发包」同样包含了JRE, 并且还附带了一些开发、诊断的工具.
为什么Java要在虚拟机当中运行?
由于Java是一种高级层面上的语言,其语法复杂、更为抽象.直接运行在硬件上不太现实,所以在运行Java之前需要做一些转换的工作.
这就好比列位要和日本人做生意, 但是不会日文,不能直接与日本人交谈.这个时候我们就需要一个翻译了.把我们说的中文翻译成日语再与对方交流.
这里的面的「列位」就相当于「Java字节码」, 请的「翻译」就相当于「虚拟机」, 交谈的「日本人」对象就相当于「执行代码的cpu」.
再解释一下, java程序经过编译之后生成「Java字节码」,Java的字节码经过「Java虚拟机」的加工转换成cpu能执行的机器码.
Java虚拟机可以由硬件实现,但是更为常见的是各个平台上的软件实现.那么这么做的意义大于一旦程序被转换成java字节码那么它就可以在不同平台上的虚拟机里运行.这就是java强大的跨平台特性的原因.
另外java虚拟机还提供了一个托管环境. 这个环境代替我们处理一些代码中冗长且容易出错的部分,比如说内存管理与垃圾回收.
此外托管环境还提供了诸如数组越界、动态类型、安全权限等等的动态检查.
从硬件视角来看, java字节码无法直接运行,因此java虚拟机需要将字节码翻译成机器码
在hotspot里, 翻译过程有两种方式:
- 解释执行
- 逐条将字节码翻译成机器码并执行.
- 即时编译「Just-in-time compilation, JIT」
- 即将一个方法的所有字节码编译成机器码再运行.
解释执行的优势在于无需等待编译, 即时编译的优势在于实际运行速度快
在hotspot中,默认的采用的是混合模式, 综合的解释执行与即时编译的优点. 它会先解释执行代码, 然后将其中反复执行的「热点代码」, 以方法为单位进行「即时编译」…