启动时间
首当其冲的就是启动时间,我们都知道 JVM 是个慢热型选手。它在启动时需要加载很多类文件,而如果你的应用需要在启动时候建立各种长链接,那启动时间基本上要以分钟来计算了。
启动性能
其次是启动性能,由于 JVM 需要在系统运行一段时间后才能逐步由解释执行转化为解释执行 + 编译执行,这也意味着 JVM 的系统需要经过一段时间的预热才能达到性能巅峰。这就像冬天的燃油车一样,必须先把发动机充分预热,才能真正上路。
内存占用
相较于在运行态只包含机器码和垃圾回收器的 Go 语言,JVM 的运行态即使只进行简单的加减乘除运算,也需要包含一个完整的解释器、一个即时编译器、一个垃圾回收器,在这个以快著称的云时代,显得有点太重了。
面向对象
曾经 Java 语言就是面向对象的代名词,Java 的那句 Slogan:everything is object,即使没有使用过 Java 语言的人也都听说过。但是你是否思考过,面向对象是否是唯一的选择?everything is object 的成本是什么?
一个 32 位 Integer 对象在内存中的空间占用如下:
- 对象头部:Header,通常占据 8 个字节。用来存储对象的元数据信息,比如对象的类型指针、锁状态等。
- 实际存储的整数值:占据 4 个字节,用来存储 32 位整数的值。
因此,一个 32 位的 Integer 对象在运行时会占用 12 字节的内存空间。在实际情况中,JVM 为了对齐内存访问会把结构体的大小向上取整到 8 的倍数,所以通常会占用 16 字节的内存空间。这还不包括内存分配、垃圾回收、并发调用等耗费的其他资源成本。那面向对象是什么,是不是必需的呢?其实面向对象只是一种抽象客观世界的方式,随着“优先使用对象组合而非类继承”逐步被大家接受,面向对象的优势正在慢慢弱化。作为新一代编程语言的代表,Go 和 Rust 其实都摒弃了面向对象的概念,并快速地发展着。这也从侧面证明面向对象并不是必需的选择。所以如何在云时代平衡面向对象的优势和成本也是一个挑战。
此文章为11月Day13学习笔记,内容来源于极客时间《云时代的 JVM 原理与实战》,强烈推荐该课程