32位和64位的JVM 我該選擇哪個呢?

2021-06-14 18:18:06 字數 1702 閱讀 6725

本文是作者vladimir šor的實際經驗分享,他在建立企業級應用時,經常會遇到該如何選擇jvm的問題,一開始他是通過拋硬幣決定,後來他有了更加深入的思考。

在開發企業軟體時,我曾經常遇到這個問題。每隔一段時間我就得去重新配置一下環境。通常問題都與「我到底應該使用32位jvm還是64位」有關。誠實講,我一開始通過投硬幣來決定,而不是給出乙個具體的理由。但現在,我已經有了更多的思考和經驗,下面就來分享給大家。

首先,是否是越大越好?64>32,所以答案就是選擇64位嗎?停,不要著急。在相同的資料結構下,64位jvm將會消耗更多的記憶體,甚至更多。我們的測量結果表明,根據不同的 jvm版本、作業系統以及硬體架構,64位要比32位多消耗30%-50%的堆空間。堆越大,gc的時間就會被延長,從而影響應用程式延遲——在4.5gb的堆上執行乙個完整的gc所花費的時間肯定要比3gb的長。所以僅僅根據大小來判斷是明顯錯誤的。

但是,你該何時使用64位呢?大多數情況下是根據大型堆的大小(heap sizes)來決定的。在不同的架構上,32位的jvm可能會面臨最大和最小堆限制,下面列出了不同平台上的限制資料:

現在你已經看到有多糟糕了吧?我打賭你肯定見過在16g以上的ram上執行32位的機器並且執行的很好。可是jvm是怎麼了?在16g ram的windows上,jvm只能分配不到10%的記憶體。

主要原因——位址空間。在乙個32位系統上,理論上每個程序可以分配4gb。而實際上並未達到,windows的程序處理空間被砍掉了一半,有一半是預留給核心(使用者程序是不能使用的) ,另外一半則留給使用者。與ram無關,32位處理器留給ram的容量只有2gb。更糟糕的是,這個位址空間必須是連續的,所以在實際應用中,windows系統通常只剩下1.5—1.8gb的堆空間。

這裡有乙個技巧,可以在32位的windows系統上減少核心但可以增加使用者空間。你可以在boot.ini裡使用3gb引數,然而要想在實際中有效,jvm必須使用largeaddressaware 開關(switch)去編譯/鏈結。 

不幸並非如此,至少對於hotspot jvm來說。直到最新的jdk 1.7版本,hotspot jvm都沒有使用這項進行編譯。但如果你在jrockit版本上執行(2006以後的版本)就是很幸運的,你可以享受到2.8-2.9gb大小的堆空間。

所以,我們可以下這樣的結論嗎:如果應用程式需要大於2-3gb的記憶體時,你應該一直在64位的jvm上執行。也許是這樣,但你必須要意識到一些問題,增加堆消耗和延長gc中斷。下面讓我們來分析一下具體原因。

問題1:64位將會多需要30%-50%的堆記憶體。為什麼會這樣?主要是因為64位架構的記憶體布局。首先,在64位jvm中,物件頭(object headers)是12位元組。其次,根據實際的jvm引數(jvm flags)和堆大小,物件引用可能是4位元組或者是8位元組。與32位相比,這明顯增加了一些額外的開銷。你也可以參考這篇文章,進去看看是如何計算物件記憶體消耗的。

問題2:gc中斷時間更長。堆構建的越多,意味著gc需要清理更多未使用的物件。這就意味著在實際運用中,當構建超過12-16gb的堆空間時,你需要更加小心。沒有調優和測量,你很容易引起乙個耗時數分鐘的完全gc中斷。應用程式在**延遲並不是至關重要的,你可以通過優化吞吐量來解決,但是在大多數情況下,它會引起不必要的中斷。

那麼,當需要引入更大的堆,但是又不希望引入64位架構帶來的這些影響時,我該怎麼做呢?在這篇文章中提供了幾個技巧——堆分割槽、gc調優、在不同的jvm上構建或者離堆分配記憶體。

重申一下,在選擇64位的時候要意識到它所帶來的影響。但是不要害怕去選擇。

jvm 32位jvm與64位jvm的比較

在高效能硬體上部署程式,目前主要使用的兩種方式 1 通過64位jdk來使用大記憶體 2 使用若干個32位虛擬機器建立邏輯集群來利用硬體資源。注 由於64位jdk存在著一些問題,所以我們一般採用第二種方式。64位jdk面臨的問題 1 記憶體 導致長時間停頓 2 現階段,64位jdk的效能測試結果普遍低...

32位和64位的理解

大家都知道現在流行的作業系統是32位和64位的,都知道32位作業系統能 認出 4g以內的記憶體而64位的 可以認出多記憶體 2的64次方byte 簡稱大b,還有一種是小b,1個byte由8個bit組成 但是為什麼會64位的能認到的記憶體就多呢?先看一下概念 32位和64位 cpu一次處理資料的能力是...

32位和64位的區別

一 支援的記憶體不同 32位的作業系統,最多支援4g的記憶體,實際記憶體為3.25g 64位系統支援4g 8g 16g 32g 64g 128g 256g記憶體,理論上可以無限支援,只要你主機板上有足夠的記憶體條。二 支援的處理器不同 64位的作業系統支援基於64位的處理器,而32位的系統卻不能完全...