HotSpot: 一 款 新 的Java 虚 拟 处 理 机

Sun 公 司 的 下 一 代 动 态 编 译 器,
它 产 生 的 字 节 码 能 够 让 程 序 风 驰 电 掣


---- 摘 要:Sun 的HotSpot 技 术 承 诺, 经 过 它 所 编 译 而 产 生 的 解 释 性 字 节 码, 将 会 比 那 些 经 编 译 而 得 来 的 执 行 程 序 还 要 跑 得 快 ! 可 能 会 有 这 样 的 事 吗 ? 当 然 毫 无 疑 问。HotSpot 到 现 在 为 止, 还 只 能 在 大 学 的 研 究 室 中 看 到, 它 以 某 种 独 特 的 方 式, 将 一 个Java 虚 拟 机(JVM) 和 一 个 编 译 器 结 合 起 来。 其 结 果 是 产 生 了 一 种 新 的 技 术, 将 把 我 们 对 语 言 性 能 的 门 户 之 见 淘 汰 出 局。 本 文 不 仅 可 以 让 你 了 解Sun 的 动 态 编 译 器 的 内 部 机 制, 而 且 可 以 使 你 了 解 什 么 样 的 应 用 程 序 和HotSpot 一 起 工 作 比 与 最 快 的JIT(just_in_time) 一 起 工 作 更 有 效。 另 外 还 将HotSpot 技 术 和 它 的 前 辈( 如 标 准 的JVM, 编 译 器 及JIT 编 译 器) 做 初 步 的 比 较。

起 跑 线: 启 动 你 的 引 擎

---- 每 个 人 都 知 道, 解 释 程 序 的 执 行 速 度 是 缓 慢 的。 预 编 译Java 源 程 序, 使 其 成 为 可 载 入 的 字 节 码, 能 够 节 省 句 法 翻 译 所 需 要 的 时 间, 但 是 与 本 地 码 执 行 的 速 度 相 比, 字 节 码 在Java 虚 拟 机(JVM) 中 解 释 执 行 的 速 度 仍 然 显 得 十 分 缓 慢。 因 此,Java 的 性 能, 通 常 被 认 为 是 只 有 在 编 写 小 程 序(applet) 的 情 况 下 才 可 接 受, 对 于 任 何 大 型 的 应 用 程 序,Java 无 能 为 力。

---- 即 时 编 译 程 序(JIT) 的 执 行 速 度 比 解 释 程 序 能 快 上 若 干 倍。 尽 管JIT 程 序 在 执 行 速 度 上 比 不 上 编 译 程 序, 但 它 还 是 极 大 地 拓 展 了Java 的 适 应 性。 但 是 它 的 应 用 程 序 还 是 受 计 算 限 制 的。 如 果 这 个 应 用 程 序 主 要 是 与 用 户 或 输 入 输 出 设 备(I/O) 进 行 交 互, 那 么 它 的 速 度 还 是 比 较 理 想 的。 但 是, 如 果 这 个 程 序 需 要 进 行 很 多 的 图 形 处 理 或 进 行 无 数 的 数 值 计 算, 那 么 它 的 执 行 速 度 就 会 急 剧 下 降, 使 用 户 无 法 忍 受。

---- Sun 公 司 新 的HotSpot 技 术, 预 计 在 今 年 夏 季 出 台, 它 是 一 种 动 态 编 译 器── 这 个 编 译 器 装 载 在 虚 拟 计 算 机 内, 保 证 能 使 大 多 数Java 应 用 程 序 可 以 和 被 编 译 过 的 执 行 程 序 一 样 快 或 更 快。HotSpot 技 术 承 诺 将 把Java 的 适 应 性 拓 展 到 一 个 更 加 广 阔 的 天 地, 使 其 能 在 从 服 务 器 到 主 流 桌 面 应 用 程 序 的 各 种 领 域 内 都 发 挥 作 用。Sun 的Java 工 作 计 划 显 示,HotSpot Java 虚 拟 机 的 开 发 人 员 版 本 原 定 在 今 年 的 第 一 季 度 早 期 出 台; 扩 展 的HotSpot Java 虚 处 理 机 实 现 将 在 今 年 夏 天 推 出。

---- 本 文 探 讨Sun 的 动 态 编 译 器 及HotSpot 的 内 部 工 作 机 制, 并 且 详 细 分 析 什 么 样 的 应 用 程 序 利 用HotSpot 能 够 比 最 快 的JIT 跑 得 更 快。( 如 想 了 解 更 多 有 关 编 译 器 及 解 译 器 的 信 息, 请 看 附 文“ 编 译 器 和 解 释 器 是 怎 样 工 作 的”, 如 想 了 解JIT 是 如 何 提 高 执 行 效 率 的, 请 看 另 一 篇 附 文“ JIT 的 工 作 机 制”。)

---- 它 们 上 路 了 !: 与 动 态 编 译 一 起 飞 驰 而 过

---- HotSpot 是 一 种 动 态 编 译 器, 它 将JIT 编 译 器 和 解 释 器 各 自 的 优 点 结 合 在 一 起, 并 将 二 者 在 单 个 程 序 包 中 得 到 统 一。 这 种 二 者 统 一 的 作 法, 给 代 码 性 能 的 提 高, 带 来 了 许 多 益 处。

---- 尽 管 动 态 编 译 的 所 有 外 在 形 象 都 是 新 的, 但 这 一 概 念 具 有 深 厚 的 理 论 基 础。10 几 年 以 来, 斯 坦 福 大 学(Stanford University) 和 加 利 福 尼 亚 大 学 芭 芭 拉 分 校(University of California,Santa Barbara) 对 此 都 有 过 长 时 间 的 研 究。 因 此 这 一 技 术 实 际 上 是 十 分 稳 定 的。 然 而 只 有 到 了HotSpot 的 提 出, 才 使 得 动 态 编 译 成 为 引 人 注 目 的 中 心。 并 且, 除 动 态 编 译 之 外,HotSpot 还 强 调 了 另 外 两 个 主 要 的 时 间 节 省 技 术: 垃 圾 收 集 和 线 程 同 步。

---- 进 行 计 算 的 代 价: 垃 圾 收 集 和 线 程 同 步

---- 不 幸 的 是, 在 大 多 数 应 用 程 序 中, 对Java 代 码 的 优 化 并 不 是 提 高 程 序 运 行 性 能 的 所 有 内 容。 一 些 所 谓 的 特 点, 能 够 帮 助Java 开 发 人 员 提 高 生 产 率 并 且 使 其 能 够 编 写 出 更 加 通 用、 更 少 错 误 的 应 用 程 序, 但 这 些 特 点 同 样 也 消 耗 了 大 量 的 程 序 运 行 时 间。 主 要 的 程 序 运 行 时 间 盗 用 者 是 垃 圾 收 集 和 线 程。 从 下 面 所 示 的 饼 图 中 可 以 看 到, 这 二 者 所 占 用 的 时 间 加 起 来 大 约 占 去 了40% 的 应 用 程 序 运 行 时 间。

图1 这 个 饼 图 显 示 了 典 型 的 应 用 程 序 中, 平 均 的 垃 圾 收 集、 同 步、 及 程 序 运 行 时 间。 它 是 以Sun Microsystems 公 司 的 一 张 幻 灯 片 为 基 础 的, 在 此 只 不 过 已 将 这 些 数 字 更 加 形 象 化 了, 以 更 加 明 显 地 表 现 出 主 要 趋 势。 请 注 意, 有 一 些 应 用 程 序 几 乎 能 够 在 垃 圾 收 集 和( 或) 同 步 方 面 消 耗 掉 它 们 的 所 有 运 行 时 间, 而 也 有 的 程 序 则 可 能 会 不 在 这 些 方 面 消 耗 任 何 时 间。 图 中 的 数 据 是 平 均 数 据。

---- Java 内 置 的 垃 圾 收 集 功 能 极 大 地 减 轻 了 程 序 人 员 的 开 发 负 担。 当 一 个 低 劣 的 程 序 无 修 无 止 地 在 没 有 释 放 内 存 的 情 况 下, 继 续 分 配 内 存, 直 至 耗 尽 所 有 内 存, 使 系 统 无 法 做 任 何 事 情 时, 计 算 机 系 统 会 被 完 全 冻 结, 出 现 死 机。 垃 圾 收 集 的 所 有 作 用 就 是 排 除 这 种“ 内 存 泄 漏” 的 出 现。 然 而 垃 圾 收 集 占 用 机 器 时 间。 利 用JIT 来 优 化 应 用 程 序 的 字 节 码 时, 它 对 虚 拟 机 的 垃 圾 收 集 不 会 起 到 任 何 作 用。 应 用 程 序 仍 需 花 费 相 同 的 时 间 来 进 行 垃 圾 收 集。 实 际 上, 有 些 应 用 程 序 进 行 分 配 内 存 及 释 放 内 存 的 频 次 是 如 此 之 高, 以 至 于 用 在 垃 圾 收 集 上 的 时 间 远 远 大 于 程 序 自 身 运 行 的 时 间。 在 这 种 情 况 下, 对 程 序 代 码 进 行 的 优 化 基 本 上 没 有 什 么 价 值。

---- 另 外 一 个 耗 尽 系 统 资 源 的 罪 魁 祸 首 是 线 程 同 步。Java 的 线 程 提 供 了 许 多 灵 活 性。 例 如, 线 索 允 许 缓 冲 输 入, 以 改 善 性 能, 并 且 能 使 开 发 者 编 写 一 个 服 务 器 程 序, 以 对 多 个 客 户 程 序 同 时 提 供 服 务。 但 是 线 索 的 同 步 是 费 时 的, 数 量 大 得 令 人 难 以 置 信 的 时 间── 实 际 上, 在 通 常 情 况 下, 大 约20% 的 应 用 程 序 的CPU 时 间 都 消 耗 在 此 之 上。 而 且, 这20% 的 时 间, 是 不 能 通 过 编 译 应 用 程 序 代 码 进 行 优 化 的 时 间。

---- 除 了 动 态 编 译 外,HotSpot 利 用 了 一 种 改 进 了 的 垃 圾 收 集 方 法, 被 称 为“ 世 代 性” 垃 圾 收 集(generational garbage collection, 或 阶 段 性 垃 圾 收 集)。 这 一 技 术 在 学 术 著 作 中 多 有 论 述, 但 如 今 在Java 语 言 中 已 广 为 利 用。 支 持 世 代 性 垃 圾 收 集 这 一 概 念 的 思 想 是, 内 存 趋 向 于 以 一 种 按 年 代 顺 序 排 列 的 形 式, 来 分 配 内 存 和 释 放 内 存。

---- 将 代 码 区 分 成 为 不 同 的 存 储 分 配“ 世 代” 有 两 个 重 要 的 益 处。 这 一 技 术 允 许 垃 圾 收 集 器 高 效 地 工 作。 不 是 让 它 在 同 一 个 时 刻 横 穿 过 所 有 内 存 ── 这 可 能 使 应 用 程 序 在 一 阵 尖 叫 声 中 停 止 运 行 ── 而 是 让 世 代 垃 圾 收 集 器 在 一 个 更 小 规 模 的 分 配 内 存 内 来 回 移 动。 这 样, 使 它 频 繁 地 运 行, 每 次 只 检 查 一 小 部 分 内 存, 就 可 能 使 垃 圾 收 集 工 作 对 程 序 的 运 行 性 能 产 生 更 为 小 得 多 的 影 响。 这 对 于 交 互 式 应 用 程 序, 显 得 特 别 重 要, 在 交 互 式 程 序 的 应 用 中, 用 户 更 加 喜 欢 可 预 言 的 操 作, 而 不 是 难 以 预 料 的 古 怪 的 行 为。 另 外, 这 种 处 理 使 垃 圾 收 集 过 程 更 为 简 化, 因 而 它 出 现 的 频 次 也 会 更 高。

---- HotSpot 同 样 改 进 了 同 步 处 理。 在 许 多 场 合 下, 原 来 需 要 多 条 线 程 同 步 工 作 的 代 码 被 精 减 成 一 个 指 令。 因 此, 在 应 用 程 序 中, 应 用 多 线 程 实 际 上 不 会 消 耗 更 多 的CPU 时 间。

---- 改 进 的 垃 圾 收 集 和 线 程 同 步 能 够 使 应 用 程 序 的 运 行 效 率 得 到 急 剧 提 高── 即 使 是 在 不 优 化 程 序 代 码 的 情 况 下。 但 是 本 文 的 主 旨 是 在 于 探 讨 动 态 编 译 的 工 作 机 制。 现 在 让 我 们 回 到 正 题 上 来。

---- 动 态 编 译 是 如 何 工 作 的。

---- HotSpot 同 时 包 括 了 一 个 动 态 编 译 器 和 一 个 虚 拟 机 来 解 释 字 节 码, 我 们 可 以 从 下 面 的 图 中 看 到。

图2 动 态 编 译 器 同 时 包 括 一 个 编 译 器 和 一 个 解 释 器。 由Java 编 译 器(JavaC) 产 生 的 字 节 码 初 在 虚 拟 机 上 被 解 释。 当 程 序 运 行 时,profiler 会 跟 踪 程 序 运 行 的 性 能 信 息, 并 选 择 某 些 方 法 进 行 编 译。 被 编 译 过 的 方 法 以 本 地 机 器 码 的 形 式 存 储 在 高 速 缓 存 中。 当 某 个 方 法 被 调 用 时, 如 果 在 高 速 缓 存 中 有 这 一 方 法, 则 这 个 本 地 机 器 码 版 本 就 会 被 调 用。 否 则, 相 应 的 字 节 码 被 重 新 解 释 执 行。 图 中 所 示 的“control” 函 数 似 乎 是 一 个 越 过 存 储 位 置 的 间 接 跳 转, 它 或 者 指 向 本 地 代 码, 或 者 指 向 解 释 程 序。( 此 间 的 细 节 还 不 甚 明 了, 但 其 实 现 方 式 大 约 就 是 这 样。)

---- 当 字 节 码 第 一 次 被 加 载 时, 它 们 以 解 释 方 式 执 行。Profiler 记 录 下 了 每 一 个 方 法 的 运 行 时 间。 当 某 个 方 法 被 认 为 是 占 据 了 许 多 时 间 的 时 候,HotSpot 对 它 进 行 编 译 并 加 以 优 化。 在 以 后, 当 调 用 这 个 方 法 的 时 候, 就 会 去 调 用 由 编 译 器 生 成 的 本 地 机 器 指 令。

---- 与 一 个JIT 相 似, 利 用 这 种 动 态 编 译 技 术 时, 前 一 次 应 用 程 序 运 行 时 所 编 译 的 结 果 并 不 能 保 留 到 下 次 程 序 运 行 时 使 用。 由 于 字 节 码 更 为 紧 凑, 因 而 它 不 但 能 节 省 存 储 空 间 而 且 能 节 省 载 入 程 序 的 时 间。 这 种 技 术 同 样 也 保 存 了 可 移 植 性, 并 允 许 优 化 程 序 来 重 新 考 虑 程 序 当 前 所 使 用 的 方 法。 就 目 前 而 言, 还 没 有 人 尝 试 过 将 运 行 时 所 编 译 出 来 的 结 果 存 储 起 来, 以 便 下 一 次 程 序 运 行 时 能 够 得 到 更 高 的 效 率 和 更 快 的 速 度。 尽 管 这 种 方 法 或 许 在 将 来 能 够 成 为 现 实, 但 眼 下Sun 还 没 有 将 其 提 上 计 划 日 程。

探 索 式 地 剖 析(Profile) 和 编 译

---- 这 个 系 统 最 使 人 着 迷 的 地 方( 至 少 对 于 那 些 对 机 器 推 理 这 一 主 题 感 兴 趣 的 人 来 说) 在 于profiler 是 如 何 决 定 哪 个 方 法 需 要 被 优 化。 当 前 的 这 个 系 统 采 用 了 一 个 非 常 微 小 的, 与 任 何 人 工 智 能 完 全 无 关 的 探 索 器。 尽 管 具 体 的 细 节 只 有 设 计 者 才 知 道, 但 是 可 以 合 理 推 测 到 系 统 是 通 过 对 某 个 方 法 占 用 时 间 情 况 的 预 测 来 优 化 这 个 方 法 的。 一 旦 某 个 方 法 所 使 用 的 时 间 达 到 了 预 先 确 定 的 极 限, 举 例 说, 达 到 了70% 的 预 定 时 间, 那 么, 这 个 方 法 就 成 为 需 要 进 行 优 化 的 候 选 者。( 具 体 的 极 限 值 豪 无 疑 问 是 无 数 次 研 究 的 结 果。)

---- 幸 运 的 是, 如Sun 公 司 的 人 所 说, 对 于 这 种 系 统, 要 求 其 完 美 无 缺 是 没 有 必 要 的。 只 要 它 在 大 多 数 情 况 下 运 行 良 好, 能 够 极 大 地 改 善 程 序 的 运 行 效 率, 也 就 达 到 了 目 的。

---- 而 且, 谁 会 知 道 ? 在 将 来 的 某 一 天, 可 能 会 有 更 为 先 进 的 人 工 智 能 探 索 器 被 应 用 到 这 一 领 域。 尽 管 还 没 有 严 格 的 计 划 来 追 求 这 种 可 能 性 -- Sun 公 司 希 望 在 未 来 的 一 两 年 内 全 力 以 赴 地 精 炼 目 前 的 实 现 -- 但 它 终 究 是 一 个 吸 引 人 去 考 虑 的 可 能 性。

动 态 编 译 的 优 势

---- 将 一 个 编 译 器 和 一 个 解 释 器 集 成 在 一 起 的 精 彩 之 处 在 于 它 能 够 做 一 些 通 常 情 况 下 静 态 编 译 器 无 法 实 现 的 事 件。 特 别 是 它 能 够 完 成 优 化 编 译, 并 且 能 够 利 用 运 行 时 刻 的 信 息 来 做 强 健 的 内 联.

---- 优 化 编 译

---- 由 于 在 运 行 时 刻, 解 释 器 总 可 以 随 时 得 到, 因 此HotSpot 的 动 态 编 译 器 可 以 假 设 异 常 及 其 它 难 以 优 化 的 情 况 不 会 出 现。 如 果 它 们 确 实 出 现 了,HotSpot 就 可 返 回 来 解 释 执 行 字 节 码。 对 于 静 态 编 译, 对 异 常 情 况 的 处 理 进 行 优 化 是 一 件 困 难 而 耗 时 的 过 程。 通 过 忽 略 这 些 情 况,HotSpot 能 够 非 常 迅 速 地 为 那 些 最 有 可 能 运 行 的 代 码 生 成 高 度 优 化 的 代 码。 这 如 同 给 赛 马 注 入 了 激 素 -- 在 时 间 优 化 方 面, 以 非 常 小 的 投 入, 换 得 了 重 大 的 性 能 提 高。

---- 运 行 时 刻 信 息

---- 动 态 编 译 的 第 二 个 主 要 优 势 在 于 其 能 够 将 只 有 在 运 行 时 刻 才 能 了 解 到 的 信 息 考 虑 在 内。 同 样, 这 一 技 术 的 细 节 仍 然 只 有 开 发 者 才 知 道。 但 是 想 象 它 却 并 不 困 难, 例 如, 如 果 在 一 个 循 环 中, 一 个 方 法 被 重 复 调 用, 直 至 某 个 下 标 的 值 为10,000( 也 就 是 说 这 个 方 法 被 重 复 调 用10,000 次), 那 么 这 个 方 法 马 上 就 会 成 为 将 被 优 化 的 候 选 者。 但 是, 如 果 在 这 个 循 环 中, 其 最 高 的 下 标 值 为1, 则 优 化 器 就 会 忽 略 这 一 方 法, 使 其 被 解 释 执 行。 由 于 静 态 编 译 器 无 法 知 道 在 运 行 时 刻 的 变 量 的 具 体 值, 因 此 它 不 能 对 这 种 情 况 作 出 相 应 的 判 断。

---- 内 联

---- HotSpot 所 执 行 的 另 一 个 重 要 的 优 化 就 是 内 联(inlining) 那 些 频 繁 被 调 用 的 函 数。 这 意 味 着 这 些 方 法 的 应 用 不 必 花 费 额 外 的 函 数 调 用 开 支, 而 是 通 过 将 这 些 方 法 的 代 码 直 接 拷 贝 给 调 用 例 程, 就 如 这 些 函 数 是 这 个 例 程 的 一 部 分 一 样 加 以 使 用。 方 法 中 的 程 序 行 数 越 少, 就 越 应 该 成 为 内 联 函 数。 只 有 一 行 的 方 法 在 调 入 和 退 出 例 程 时 所 花 费 的 时 间, 可 能 多 于 真 正 执 行 这 行 代 码 所 花 费 时 间 的 两 倍。

---- 内 联 为 性 能 的 提 高 提 供 了 强 大 的 推 动 力, 但 它 是 以 程 序 规 模 的 扩 大 为 代 价 的。 如 果 每 一 个 被 调 用 的 方 法 都 被 拷 贝 到 其 被 调 用 的 地 方, 那 么 程 序 将 会 比 它 原 有 的 规 模 膨 胀 五 到 十 倍。 但 是HotSpot 仅 仅 优 化 那 些 程 序 中 关 键 的 部 分。 二 八 律 表 明,80% 的 程 序 运 行 时 间 都 花 费 在20% 的 代 码 之 上。 通 过 将 大 约20% 的 代 码 内 联,HotSpot 就 能 以 可 接 受 的 规 模 扩 大 代 价, 换 取 运 行 性 能 的 重 大 提 高。 此 外, 运 行 时 刻 的 信 息 起 着 重 要 的 作 用, 因 为HotSpot 凭 此 知 道 在 什 么 地 方 去 找 那 些 关 键 的20% 的 代 码。

---- 对 于 所 有 好 事, 当 然 应 当 有 个 折 衷。 如 果 一 个 方 法 非 常 大, 则 这 个 方 法 花 费 在 调 入 和 退 出 例 程 上 的 时 间 仅 仅 只 是 其 运 行 时 间 中 的 一 小 部 分。 在 这 种 情 况 下, 复 制 方 法 所 导 至 程 序 空 间 膨 胀 的 代 价 远 远 大 于 内 联 所 节 省 的 时 间。 因 此,HotSpot 豪 无 疑 问, 应 当 有 一 个 上 限 来 规 定 有 多 大 规 模 的 方 法 可 以 内 联。( 然 而, 具 体 的 细 节 也 只 有 设 计 者 才 能 知 道。)

---- 最 后, 由 于HotSpot 做 了 优 化 编 译, 它 只 能 够 内 联 正 常 执 行 的 方 法, 而 不 是 所 有 可 能 的 方 法。 因 此 它 就 可 能 不 会 劳 心 费 神 地 去 解 决 那 些 罕 见 情 况 下 出 现 的 疑 难 问 题, 而 是 将 其 忽 略, 不 去 过 问。 这 样, 你 就 能 够 通 过 最 小 的 优 化 努 力 得 到 最 大 的 性 能 提 高。

---- 什 么 情 况 下 动 态 编 译 会 取 得 成 功 -- 而 什 么 情 况 下 它 会 失 败

---- 在 大 多 数 情 况 下, 利 用HotSpot 比 利 用JIT 技 术 能 够 取 得 大 得 多 的 性 能 提 高, 更 不 用 说 比 通 常 的JVM 解 释 技 术 带 来 的 益 处。 但 是, 在 不 同 环 境 下, 任 何 性 能 提 高 技 术, 在 进 行 动 态 编 译 时 都 不 可 能 达 到 性 能 最 优 化。 例 如, 在 一 次 程 序 运 行 之 后,Profiler 就 决 定 优 化 哪 一 段 代 码。 在 极 端 情 况 下, 优 化 器 就 会 信 誓 旦 旦 地 对 所 有 方 法 进 行 优 化, 显 而 易 见, 这 决 不 能 成 功。 当 然, 这 种 情 况 很 少 发 生。

---- 将HotSpot 技 术 应 用 于 那 些100% 的 纯 计 算 程 序 时, 得 到 的 效 果 将 会 极 差。 这 些 程 序 几 乎 没 有 或 根 本 没 有 垃 圾 收 集, 没 有 线 程 同 步, 只 有 少 量 的 初 始 化 代 码。 例 如, 将 前1000 个 素 数 相 乘, 并 将 结 果 输 出, 这 样 的 程 序, 就 是 这 种 程 序 的 一 个 例 子。 对 于 这 种 程 序, 利 用 一 个 好 的JIT, 可 能 会 得 到 更 好 的 性 能, 因 为 在 优 化 之 前,JIT 并 不 停 下 来-- 它 会 将 所 有 的 代 码 抢 先 优 化。

---- 最 后,HotSpot 技 术 缺 少 一 种 象CaffeineMark 一 样 的 人 工 基 准(benchmark)。 由 于 这 种 基 准 不 会 仿 效 现 实 世 界 的 程 序, 因 此 有 可 能 写 出 一 种 可 以 探 测 没 有 价 值 事 例( 如 不 做 任 何 事 的 循 环) 并 将 其 优 化 出 去 的 编 译 器。 这 种 编 译 器 能 够 生 成 非 常 快 的 基 准 时 序, 并 且 不 在 程 序 生 成 过 程 中 反 映。 作 为 一 个 编 译 器, 对 这 些 怪 异 的 事 例 不 进 行 优 化, 从 这 方 面 来 看,HotSpot 并 不 见 得 高 明, 即 使 它 在 真 实 世 界 中 表 现 良 好。(Sun 最 近 对 此 进 行 了 论 证, 他 们 设 计 了 一 个 编 译 器, 来 专 门“ 优 化” 这 些 基 准, 直 至 使 程 序 变 成 在 基 本 的 零 次 内 运 行 的 几 乎 什 么 都 没 有 了 的 程 序。 尽 管 他 们 的 尝 试 在 民 意 测 验 中 遭 到 反 对, 它 还 是 表 明, 这 种 基 准 对 性 能 的 提 高 并 不 十 分 值 得 信 赖。)

---- 对 于 任 何 增 强 性 能 的 技 术 来 说, 最 基 础 的 问 题 是: 它 对 你 的 应 用 程 序 倒 底 有 何 好 处 ? 在 大 多 数 的 普 通 应 用 程 序 中, 垃 圾 收 集 和 线 程 同 步 都 会 发 生, 也 存 在 着 真 正 的 代 码 重 复,HotSpot 方 法 对 性 能 的 巨 大 提 高 起 到 了 十 分 重 要 的 作 用。

---- HotSpot 与 本 地 代 码 的 比 较

---- 本 文 中, 我 们 一 直 将 动 态 编 译 和 其 它 处 理Java 代 码 的 方 法 进 行 比 较。 但 这 种 比 较 仅 限 于 将 一 种Java 形 式 和 另 一 种Java 进 行 比 较。 有 些 怀 疑 主 义 者 会 忍 不 住 发 问:“ 就 算 你 说 的 都 对, 但 它 与 我 最 好 的 编 译 器 相 比, 究 竟 如 何 呢 ?” 对 此 我 的 回 答 是: 现 在, 这 一 技 术 已 经 可 以 和 本 地 编 译 器 相 媲 美, 而 将 来 它 更 可 能 青 出 于 蓝。Sun 将 其 目 标 定 位 在 所 取 得 的 性 能 能 够 与 优 化 后 的C 程 序 相 抗 衡 这 一 级 别 上。 随 着 时 间 的 流 逝,Sun 确 信 能 够 达 到 这 一 目 标。

---- 在 目 前, 好 的JIT 编 译 器 已 经 赶 上 或 超 过 了 面 向 对 象 程 序 的C++ 静 态 编 译 器, 这 点 可 从“ 性 能 测 试 表 明,Java 和C++ 一 样 快”(http://www.javaworld.com/jw-02-1998/jw-02-jperf.html) 这 篇 文 章 中 看 到。 而HotSpot 比JIT 还 快。 尽 管 它 目 前 还 不 能 赶 上C 语 言 的 性 能, 但 正 向 这 个 目 标 逼 进。

---- 请 注 意:C++ 可 以 象Java 一 样 用 于 生 成 面 向 对 象 的 程 序, 也 可 以 象C 语 言 一 样, 创 建 运 行 速 度 极 快 的 非 面 向 对 象 代 码。 现 在,Java 可 以 和 面 向 对 象 的 C++ 程 序 相 匹 敌。 但 是C++ 程 序 可 以 被 优 化 成C 风 格 的 代 码, 提 高 其 性 能, 但 Java 不 允 许 这 一 功 能。 因 为 这 会 使 代 码 难 以 维 护, 虽 然 它 能 运 行 得 很 快。

终 点 线 ? 比 赛 才 刚 刚 开 始 !

---- HotSpot 是Java 语 言 的 第 一 个 运 转 的 动 态 编 译 器 版 本。 它 的 运 行 正 确 性 已 通 过 检 验。 现 在 的 目 标 是 积 极 地 精 炼 和 增 强, 直 至 达 到 最 佳 的 性 能。Sun 相 信, 在 以 后 的 几 年 内, 它 能 够 达 到 优 化 过 的C 语 言 的 速 度。

---- 这 样 的 展 望 是 令 人 激 动 的。 一 个 平 台 独 立 的 代 码, 竟 能 超 过 本 地 优 化 代 码 的 性 能, 这 个 前 景 预 示 着 在 以 后 的 几 年 内,Java 语 言 将 实 际 上 成 为 所 有 应 用 程 序 的 首 选 语 言。 它 将 不 仅 仅 是 制 做applet 的 语 言 了。

附 文1---- 编 译 器 和 解 释 器 是 怎 样 工 作 的

---- 这 部 分 是 有 关 语 言 编 译 器、 解 释 器 和 字 节 码 解 释 器 的 历 史 性 综 述。

附 文2---- JIT 的 工 作 机 制


编 译:张 智 雄
文 章 来 源:http://www.javaworld.com/javaworld/jw-03-1998/jw-03-hotspot.html


中国计算机世界出版服务公司版权所有