@babydragon
2017-03-13T10:28:47.000000Z
字数 1833
阅读 1447
java
一种语言是轻是重,可能会影响到使用者的选型;同时,语言的轻和重有很多度量的维度。本文通过几个方面对比,看看JVM是否有想象中的那么重。
一种语言是轻是重,可能会影响到使用者的选型;同时,语言的轻和重有很多度量的维度。本文通过几个方面对比,看看JVM是否有想象中的那么重。
这些问题可以让我们抛开一些偏见,从多个方面来度量JVM。
认为JVM重的第一个原因是前期安装成本比较高。相比于下载大小只有大约15MB左右的Node和Ruby安装包,JDK下载大小大约为200MB。但是,这仅仅是表面上的,对于Node和Ruby,系统上还必须安装C编译器,这就得再加上几百兆空间。甚至在生产环境也需要一个编译器!
Node和Ruby实际需要的总大小被依赖的每个小部分分解了,如果将这些部分都统计起来,还不如单独下载200MB的包比较高效,更别说在依赖上花费的时间了。
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
。
归功于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/(译文有删减)