庞大、整体化的 JDK 应该模块化

  • Dio Synodinos
  • 崔康

2008 年 12 月 1 日

话题:Java语言 & 开发架构

Sun 公司的首席工程师——Mark Reinhold 一直主张将 Sun JDK 模块化。他举例说明了复杂性如何损害这个平台,以及JDK 6 update 10 版的 Java Kernel 和 Quickstarter 的功能只是解决了 JDK 长期关联成长导致的表面诟病。  

Mark 首先解释了 JDK 为何会成为现在这样庞大的状态:

JDK 非常大,但还没有像宇宙这么大。

JDK 很大是因为在过去 13 年里,Java SE 平台已经从一个最初打算用于嵌入式设备的小系统发展成为横跨广阔领域、服务于广大需求的一套丰富的库集合。拥有这样一个庞大且功能强大的瑞士军刀真是难以置信的方便,不过尺寸却不合适。

他接着解释了由此导致的缺点:

JDK 很大——同时也是紧密关联的。它作为一个整体的软件系统构建。在这种开发模式下,当编写新代码或者改进老代码的时候,很自然地会利用平台的其他部分,依靠 Java 虚拟机的灵活链接机制保证运行时一切都正常工作。

但是多年来,这种开发形式导致了 API 之间的意想不到的关联——和 API 的实现之间——这又增加了启动时间和内存占用。例如,一个简单的命令行“Hello, world!”程序,现在加载和初始化超过 300 个单独的类,尽管做出了更优秀的工程优化(比如类共享),但是在最新的桌面系统上仍然需要 100 毫秒。当然,对于更大的应用来说,情况会更糟糕。

Mark 似乎认为JDK 6 update 10 版中的 Java Kernel 和 Quickstarter 功能是不够的:

JDK 6 update 10 版的 Java Kernel 和 Quickstarter 功能的确改善了下载时间和(冷)启动时间,至少对 Windows 用户来说是这样。这些技术也确实解决了长期关联成长的表面诟病,但是,没有解决根本问题。

模块化 JDK——最有希望改进下载时间、启动时间和内存占用这些关键值的方法是正面解决根本问题:把 JDK 划分为一系列定义良好的、单独的、但是互相依赖的模块。

他又谈论了模块化对平台的好处:

把 JDK 分解为模块的过程会强迫所有意想不到的关联公开化,然后经过分析,多数会被隐藏或者消除。这反过来,会减少加载类的总数,从而改善启动时间和内存占用。

如果我们有一个模块化的 JDK,在下载时,我们就会提供启动特定应用所需的那些模块,而不是整个 JRE。Java Kernel 是这种解决方案的第一步,使用定义良好的模块的进一步好处是下载流可以根据当前应用的特定需要提前定制。

Weijun 对最初的帖子发表了意见,认为JDK 的整体特性是由于 Java 没有管理依赖的合适方式导致的

JDK 很大是因为 Java 从来没有指定任何管理软件依赖的工业级方法。

因此,唯一可靠部署 java 栈的办法就是把它打包成一个巨大的怪物。

顺便说一句,只有 SUN 和其 JDK 是这样的。这种缺少依赖性管理的最坏结果不是导致 JDK 臃肿,而是所有带有硬编码类路径和大量分支的无法管理的应用(因为如果你无法独立的管理和更新依赖,你可能会分支出一个被迫绑定到应用的私有拷贝)。

你应该很容易理解为什么 Java 只存在于 J2EE 服务器中(服务器提供了基础 java 平台所缺少的管理功能)

GeekyCoder 认为模块化的 JDK 对大多数开发人员来说可能不是最急需的

虽然这很“酷”,但我怀疑这对大多数开发人员来说是否是最急需的。

我有一种不好的感觉,就是你可能会被少数对你博客的积极回应所影响,而不论他们是否代表了整个 Java 开发社区。

即使只是修复一个票数最多的 bug 也比仅仅搞“酷”要好得多。

我认为“倾听你的客户”只是一个过时的、封闭的、已经被彻底抛弃的想法,但是,看一看好的方面... 你现在拥有两名声称乐于助人的开发人员。祝你好远。

Similarly Michael B 似乎认为企业用户不关心模块化 JDK

模 块化的 JDK(或更确切地说 JRE)对企业用户完全无关。我认为,企业用户喜欢 JDK 它现在的样子,因为模块意味着依赖,这听起来像“DLL 地狱” 。现在 JDK 很容易分发和打补丁,这很重要。另外,Java 具有良好的向上兼容性:不仅“编写一次,到处运行” ,而且还“编写一次,永远运行” ,这意味着巨大的投资回报率( ROI )。这是人们更喜欢 Java 而不是.NET 的原因之一 。MS 的战略一直是: “这是添加了最新功能的新版本,请修改和兼容你的所有应用。 ”MS 技术太短命了。 Java 平台目前已经模块化:模块是我的应用所需要的第三方库。我喜欢 SUN 的模式——只有这些库足够成熟了才会变成平台的一部分。 健壮性和可靠性是 Java 成功的关键。所以,请回去继续解决那些剩余的 bug 吧。我真的很喜欢 JDK 6 update 10 版的这方面功能。

 

你可以通过 InfoQ 获取Java 平台或者Java SE的更多信息。

查看英文原文:The Massive, Monolithic JDK should become Modular

Java语言 & 开发架构