signed

QiShunwang

“诚信为本、客户至上”

Java代码为什么要在虚拟机中运行?

2021/5/15 1:03:15   来源:

写在前面

本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和文献引用请见100个问题搞定Java虚拟机

解答

1. JVM提供了跨平台的特性
2. JVM提供了自动内存管理与垃圾回收的能力
3. JVM提供了诸如数组越界、动态类型、安全权限等的动态检测能力

补充

跨平台

Java 作为一门高级程序语言,它的语法复杂,抽象程度较高,直接在硬件上运行 Java 会使得 Java 程序员纠缠在不同硬件的适配开发中。
所以,为了更方便的实现可移植性,Java 的创造者(James Gosling等)引入了一个面向 Java 语言特性的虚拟机,
通过编译器将 Java 程序转换成该虚拟机所能识别的指令序列,即 Java 字节码。

通过 Java 字节码这个中间层表示,只需要根据不同平台提供不同的虚拟机实现,即可实现C开发人员"梦寐以求"的"一次编写,到处运行"。

托管环境

虚拟机带来了一个托管环境(Managed Runtime)。这个托管环境能够代替我们处理一些代码中冗长而且容易出错的部分。
其中最广为人知的就是自动内存管理与垃圾回收,这使得 Java 程序员从繁琐且易错的内存分配回收逻辑中脱离出来,专注于业务开发。

当然,这也有弊端,虚拟机毕竟不是真正的业务技术专家,无法准确的根据实际需求来分配回收内存,只能使用通用的算法,而且由于 JVM 向
Java 程序员承诺了不需要管理内存,这也会使得部分 Java 程序员把内存管理完全交给了默认配置的 JVM,这会导致更多诸如 OOM,频繁
Full GC等问题的出现。

现在更多的大数据框架比如 Spark,Flink 等都选择使用直接内存避免JVM自动管理内存,这在提升性能上会带来更大的收益。

动态检测

托管环境提供了诸如数组越界、动态类型、安全权限等等的动态检测,使我们免于书写这些无关业务逻辑的代码。