写点什么

JVM 很重吗?

  • 2017-03-13
  • 本文字数:1614 字

    阅读完需:约 5 分钟

一种语言是轻是重,可能会影响到使用者的选型;同时,语言的轻和重有很多度量的维度。本文通过几个方面对比,看看 JVM 是否有想象中的那么重。

如何来度量?

  • 下载包的大小?
  • 运行时占用的资源?
  • 库文件占用硬盘大小?
  • 部署成本?
  • 开发成本?

这些问题可以让我们抛开一些偏见,从多个方面来度量 JVM。

安装成本高嘛?

认为 JVM 重的第一个原因是前期安装成本比较高。相比于下载大小只有大约 15MB 左右的 Node 和 Ruby 安装包,JDK 下载大小大约为 200MB。但是,这仅仅是表面上的,对于 Node 和 Ruby,系统上还必须安装 C 编译器,这就得再加上几百兆空间。甚至在生产环境也需要一个编译器!

Node 和 Ruby 实际需要的总大小被依赖的每个小部分分解了,如果将这些部分都统计起来,还不如单独下载 200MB 的包比较高效,更别说在依赖上花费的时间了。

JVM 运行时重吗?

JVM 运行速度很快,甚至可以说是最快的运行时框架之一。随着时间的推移,JVM 运行的速度更快,更轻便。上千个工程师致力于优化 JVM,甚至有人已经为其贡献了 21 年的代码。

JVM 支持原生线程、多个内核,并且能够通过各种配置修改 JVM 行为,或者只使用默认配置。其中可能必须要了解的配置是如何设置 JVM 的内存,以控制 JVM 在限定环境下发挥它的作用。

通常情况下,部署一个 Java 应用程序只需执行java -server -Xmx512m app.jar。如果这还不够,可以参考使用其他参数。

磁盘使用量重吗?

对于 Java 应用程序,如果使用 Maven 作为其依赖管理程序,所有依赖都会下载到~/.m2 目录。以下这个示例,是结果经过了 9 个月的 Clojure 开发,仅仅积累了 1010MB 依赖,甚至都不到 1G 空间。

复制代码
$ du -sh /usr/local/opt/rbenv/versions/2.3.3 ~/.nvm/versions/node/v6.9.1 ~/.m2
690M /usr/local/opt/rbenv/versions/2.3.3
232M /Users/kenneth/.nvm/versions/node/v6.9.1
1010M /Users/kenneth/.m2

上述示例中,Ruby 目录为全新安装,其中内容只有一个博客和一个简单工程。这些依赖占用了近 700MB 依赖存储。

Node 相关目录只安装了 ember、docpad 和 bower,总大小超过 200MB。

部署过程重嘛?

通常情况下 Java 应用构建结果为 Jar 或者 War 包。其中 Jar 包包含了应用程序运行所需要的所有文件,而 War 包一般需要一个应用服务器(如 Tomcat、Jetty 等)。

对于 Jar 文件,我们只需要简单的将 JAR 文件放置到需要部署的机器上,让 JVM 执行它即可。而 War 包,也只需要放置到应用服务器对应目录中。当前,也可以简单的将 HTTP 服务端代码整合到 Jar 包中,类似于目前流行的微服务应用(如 Springboot)。而且,至少 Java 应用不需要在生产环境机器上运行apt-get install build-essentials

JVM 日常使用

归功于 Java 生态的发展,开发基于 Java 的应用有一系列工具。例如通过 Maven,我们可以方便的管理 Java 应用的依赖,并通过其插件,得到最终构建出来的 Jar 包或者 War 包,甚至直接运行。通过 IDE,可以方便的进行代码补全、应用启停、断点调试等操作。

另外,JVM 可以很方便的通过启动参数配置内存使用,在开发机器上和实际生产机器上使用不同的参数,降低本地调试成本。同时,Java 还定义了 JDWP(Java Debug Wire Protocol),支持运行时替换代码,而无需每次修改都重新编译,重新启动。

总结

判断 JVM 是否重需要非常小心。作为一种语言,判断 Java 语言优劣需要各方面评判,但是 JVM 可以单独剥离出来讨论。

很多人都认为 JVM 是个巨大的怪兽。不过归功于诸多大神的支持,使得我抛弃了之前的观点。

不过,本文没有“Node 语言终结”或者“Ruby 语言终结”的意思,仅仅是通过一些角度给出一些观点,读者可以借此考虑消除自己常用语言的膨胀。

查看英文原文: https://www.opensourcery.co.za/2017/01/05/the-jvm-is-not-that-heavy/ (译文有删减)


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017-03-13 19:004203

评论

发布
暂无评论
发现更多内容

免费不限量,通义灵码已经全面支持 Qwen3-coder 模型,“效果很惊艳”

阿里云云效

嘉为蓝鲸 WeOps+Microsoft Teams:提升跨国运维信息传递精准度

嘉为蓝鲸

智能运维 #WeOps 一体化运维

Bonree ONE 发布直通车 | Bonree ONE多地多中心版本首发!全行业部署与应用深度解析

博睿数据

内网IM:BeeWorks私有化部署的安全通讯解决方案

BeeWorks

即时通讯 IM 私有化部署

让复杂 AI 应用构建就像搭积木:Spring AI Alibaba Graph 使用指南与源码解读

阿里巴巴云原生

阿里云 微服务 云原生 Spring AI Alibaba

京东零售重磅开源 | OxyGent:像搭乐高一样组装AI团队,实现群体智能

京东零售技术

Data Agent:超越BI与AI的边界

字节跳动数据平台

Canvas X Draw for Mac 矢量插图设计软件

晨光熹微

7月25日 矩阵起源亮相深圳DA数智大会,解读多模态大模型驱动的数据处理新方法

MatrixOrigin

海淀“小孩哥”用文心快码打造少年编程开源社区

Comate编码助手

少儿编程 代码自动生成 AI 代码助手 AI 编程 文心快码

嘉为蓝鲸CTeam敏捷协同平台:一站式实现Jira迁移与研发管理升级

嘉为蓝鲸

DevOps 智能运维 敏捷协同平台

C#解析JSON数据全攻略

量贩潮汐·WholesaleTide

C# json

第十六章 Seo最简单的赚钱方式-广告

溪抱鱼

SEO

再添荣誉!嘉为蓝鲸斩获可信云技术典型实践大奖,彰显智能运维实力

嘉为蓝鲸

AIOPS 智能运维 cmp 可信云大会

直播精彩回顾 | 拆解金融行业“隐形风险”,可观测性守护核心业务生命线

博睿数据

MyEMS能源管理系统后台配置-车间管理

开源能源管理系统

开源 能源管理系统

免费不限量,通义灵码已经全面支持 Qwen3-coder 模型,“效果很惊艳”

阿里巴巴云原生

通义灵码

Seed 端到端同声传译大模型:3s 延迟,实时声音复刻;昆仑万维 Mureka TTS 更新,支持音色设计丨日报

声网

AI Agent热潮还能火多久?

Techinsight

硬核来袭!「AI 进化论:智算时代 OS 的破局之路」首期直播上线

OpenAnolis小助手

centos AI 操作系统 龙蜥社区 智算时代

「宇树科技」启动IPO,29家产业链公司齐飞!

机器人头条

特斯拉 人形机器人 具身智能 宇树科技 智元机器人

CMeas效能洞察平台:10分钟,从数据到研发度量报表

嘉为蓝鲸

DevOps 智能运维 效能洞察

企业IM:BeeWorks私有化即时通讯助力高效协作

BeeWorks

即时通讯 IM 私有化部署

【深入解剖Spring事务管理】原理、传播机制与12大失效场景避坑指南

不在线第一只蜗牛

spring

Web前端入门:JavaScript 哪些地方需要 try...catch 异常捕获

量贩潮汐·WholesaleTide

前端 Web

传奇IP续作:融合创新技术 数字娱乐产业迎来新发展机遇

江湖老铁

微服务的10大问题

不在线第一只蜗牛

JavaScript 微服务

2025 制造业必看!当 RPA 遇上 AI Agent,这 5 类流程将被彻底重构

Techinsight

智能化

OpsPilot 动态知识图谱上线:让企业知识具备“理解力”与“关联力”

嘉为蓝鲸

智能运维 #WeOps OpsPilot

KWDB多副本集群保姆级部署

KaiwuDB

面试官:聊聊RAG的执行流程?

王磊

JVM很重吗?_Java_Kenneth Kalmer_InfoQ精选文章