天天看點

Jikes 研究虛拟機(RVM)一 設計和實作問題

Jikes 研究虛拟機(RVM)

Thomas J. Watson 研究中心的 Jalapeno 研究項目的一個獨立開發的部分

2000 年 2 月 02 日

Jalape�o 是用 Java 語言編寫的用于 Java 伺服器的虛拟機。為了滿足伺服器的要求(尤其是性能和可伸縮性),Jalape�o 的設計是“從零做起”的,而且盡可能地自給自足。Jalape�o 的獨特的對象模型和記憶體布局允許硬體空指針檢查和數組元素、字段和方法的更快速通路。慣例上由本機代碼提供的運作時服務也主要用 Java 實作。Java 線程由虛拟處理器(作為作業系統線程實作)進行多路複用。支援一系列并發對象配置設定器和一系列并行的類型确切(type-accurate)的垃圾回收器。Jalape�o 的可互操作的編譯器使我們能夠進行準搶先的線程切換和精确的對象引用定位。Jalape�o 的動态優化編譯器是為了獲得被認為會頻繁執行的或計算密集的方法的優質代碼而設計的。

Jalape�o 是用于伺服器的 Java 虛拟機(Java virtual machine(JVM))。伺服器上的記憶體限制不象其它平台那麼緊。另一方面,用于伺服器的 JVM 必須很好地滿足如下這些要求(這些要求在客戶機、個人電腦或其它嵌入式 JVM 上沒這麼嚴格):

高性能處理器的利用 ― 目前的即時(just-in-time(JIT))編譯器并未在利用現代硬體的特性(記憶體層次結構、指令級并行、多處理器并行等)方面做大量的優化工作,而要獲得能與靜态編譯語言相媲美的性能,就有必要利用這些特性。

SMP 可伸縮性 ― 共享記憶體多處理器(Shared-memory multiprocessor(SMP))配置在伺服器上很流行。有些 JVM 把 Java 線程直接映射到重量級作業系統線程。随着 Java 線程數的增加,這會導緻 SMP 上的多線程 Java 程式的可伸縮性很差。

線程限制 ― 很多伺服器應用程式都要為每個進入的請求建立新線程。然而,由于作業系統的限制,有些 JVM 無法建立很多的線程,因而隻能處理有限數量的同時請求數。這些限制嚴重制約了需要同時支援成千上萬個使用者的應用程式。

連續可用性 ― 伺服器應用程式必須能在長時間(例如,幾個月)的連續運作中滿足進入的請求。這看來不是目前的 JVM 優先考慮的問題。

快速響應 ― 多數伺服器應用程式都有嚴格的響應時間要求(例如,至少有 90% 的請求都必須在 1 秒鐘内得到服務)。然而,目前的很多 JVM 都使用非增量垃圾回收,導緻了嚴重的響應時間故障。

庫的使用 ― 用 Java 代碼編寫的伺服器應用程式典型地建立在現有的庫(bean、架構、元件等)的基礎上,而不是“從零開始”寫起。然而,由于這些庫是為處理一般情形編寫的,是以它們在目前的 JVM 上性能都很差。

适度的性能降低 ― 當向伺服器提出的請求數超出了伺服器滿足請求的能力時,伺服器性能的降低是可以接受的。伺服器崩潰是 不能接受的。

在 Jalape�o 中,要求 1 由一個動态優化編譯器來滿足;對未顯現為性能瓶頸的代碼,我們提供了較輕量級的編譯器。要求 2 和 3 通過 Jalape�o 中輕量級線程的實作來滿足。用 Java 語言來實作 Jalape�o 滿足了要求 4:Java 的類型安全性有助于寫出正确的代碼,而 Java 的自動存儲管理則防止了“懸擺指針”并減少了“存儲洩漏”。我們希望目前正在研究的并發及增量記憶體管理算法能滿足要求 5。要求 6 将通過對 Jalape�o 優化編譯器的專門化改造來滿足,該編譯器将用于庫(例如)的動态地編譯後的代碼修改成伺服器應用程式的調用上下文。雖然我們知道沒有能保證滿足要求 7 的程式設計方式,我們仍盡量不忽視它。

本文按以下方式組織。下一部分考慮實作問題。接着的部分給出 Jalape�o JVM,包括它的對象模型和記憶體布局以及運作時子系統、線程和同步子系統、記憶體管理子系統和編譯子系統。接着的幾部分研究 Jalape�o 優化編譯器,描述 Jalape�o 的目前功能狀況并給出一些初步的性能結果,還讨論了相關工作。最後一部分給出我們的結論。包含的兩個附錄用于解釋 Jalape�o 的運作時服務如何為 Jalape�o 使用者避開一些 Java 限制而仍然保持該語言的完整性,并描述自舉 Jalape�op 的詳細過程。

<a>設計和實作問題</a>

Jalape�o 項目的目标是“從零開始”生産出世界級的伺服器 JVM。我們的方案是建立一個靈活的測試平台,您可以用這個平台探索、量度及評估新的虛拟機想法。我們的開發方法論是避免過早的優化:最初實施的是簡單的機制,隻有當發現它是性能瓶頸時才進一步加工它。

Jalape�o 隻有極小一部分 不是用 Java 語言寫的。Jalape�o 虛拟機被設計成作為使用者級 AIX 程序運作。是以,它必須使用宿主作業系統,以通路底層的檔案系統、網絡和處理器資源。要通路這些資源,我們面臨一個選擇:可以用低級系統調用約定來調用 AIX 核心,或者可以通過标準 C 庫來通路 AIX 核心。我們選擇後一種辦法以使我們不依賴特定于發行版的作業系統核心。這就要求 Jalape�o 的一小部分要用 C 而不是 Java 代碼編寫。