11.29 32、64位JVM區分不再重要嗎?

簡介

在本文中找到有關於32位JVM和64位JVM之間的區別的一些常見問題的答案。你將學到在這兩者之間進行遷移時要考慮的所有事情,將有助於你更好地實施。

32位JVM和64位JVM之間存在一些明顯的區別和細微差別。我將嘗試通過此問答文章來澄清它們。

我們是否需要了解32位JVM和64位JVM之間的區別?

如果你不是在構建性能型Java服務,則不必瞭解它們之間的區別。32位JVM和64位JVM之間的細微差別不會對你的Java服務產生太大影響。

64位JVM的性能是否優於32位JVM?

我們大多數人認為64位大於32位,因此64位JVM性能將優於32位JVM性能。其實不然,事實並非如此。與32位JVM相比,64位JVM的性能可能會有所下降。以下是Oracle JDK文檔中有關64位JVM性能的摘錄:


通常,與在32位VM上運行同一應用程序相比,能夠處理大量內存的好處是64位VM的性能損失較小。當你遷移到64位VM時,將在64位平臺上運行的應用程序與在SPARC上的32位平臺運行的應用程序相比,性能差異降低了10-20%。在AMD64和EM64T平臺上,此差異範圍為0-15%,具體取決於訪問應用程序所執行的指針的數量。”

如果性能受到影響,為什麼有人會使用64位JVM?

在32位JVM中,最大可尋址內存空間僅為2 ^ 32(即〜4gb)。這意味著Java進程的最大內存大小不能超過4GB。實際上,由於各種其他限制(例如可用交換,內核地址空間使用,內存碎片和VM開銷),該限制要低得多。下表總結了可以在32位JVM上設置的最大堆大小(即-Xmx):


32、64位JVM區分不再重要嗎?


而如果你在64位JVM上運行應用程序,則最大可尋址內存空間為2 ^ 64(即... 沒算出來--_--)。這意味著你的應用程序的最大可尋址內存大小接近無限。
`

為什麼64位JVM性能可能比32位JVM慢

這是由於以下事實:系統中的每個本機指針佔用的是8個字節而不是4個字節。此額外數據的加載對內存使用有影響,這取決於執行過程中加載了多少個指針,從而導致執行速度稍慢。

好消息是,由於以64位模式運行的AMD64和EM64T平臺,Java VM獲得了一些額外的寄存器,可用於生成更有效的本機指令序列。比較32位和64位執行速度時,這些額外的寄存器將性能提高到通常根本沒有性能損失的地步。

從32位JVM遷移到64位JVM時需要考慮哪些事項?

GC Stop World時間

從32位JVM遷移到64位JVM的主要原因是要獲得較大的堆大小(即-Xmx)。當增加堆大小時,GC暫停時間會自動開始變長,因為現在內存中有更多垃圾需要清除。在進行遷移之前,你需要進行適當的GC調整,否則,你的應用程序可能會經歷幾秒鐘到幾分鐘的暫停時間。於此同時,有一個專門的GC分析網站可以供你去配置使用GCeasy

Native library

如果你的應用程序使用Java本機接口(JNI)訪問本機庫,那麼你還需要升級Native library,因為32位JVM只能使用32位Native library。同樣,64位JVM只能使用64位Native library。

什麼是CompressedOops?它與32位,64位JVM有關嗎?

32、64位JVM區分不再重要嗎?


是的,CompressedOOps與32位和64位JVM有關。

我們用數據字段定義對象。當在內存中創建該對象以及數據字段時,還將創建對象標頭。JVM需要對象標頭來執行內部處理,虛擬方法調用,垃圾回收,鎖定等。

在32位JVM中,此對象標頭佔用8個字節;在64 位JVM中,該對象標頭佔用16個字節。增加8個字節聽起來可能並不多,但是鑑於你的應用程序在其運行時創建了數百萬個對象,將8個字節乘以數百萬個對象可能會增加可觀的開銷。

你可以通過傳遞XX:+ UseCompressedOops JVM參數來緩解此問題。當你傳遞此參數時,JVM會做出一個巧妙的技巧,並將對象標頭的大小優化為即使在64位中也僅使用12個字節。只要你的JVM堆大小(即-Xmx)小於32GB,此技巧就會起作用。如果超過32 GB,則對象標頭大小將再次變為16個字節。

注意:自Java SE 6u23及更高版本以來,已將-XX:+ UseCompressedOops設置為默認值。僅當你在JDK 6u23或更早版本上運行時,才傳遞-XX:+ UseCompressedOopsargument。

什麼時候應該使用32位和64位JVM?

<2GB內存:如果你的應用程序的堆大小(即-Xmx)小於2GB,則無需費力地決定。使用32位JVM。

> 2GB內存:如果你的應用程序需要2GB以上的內存,那也不是明智的決定。使用64位JVM。但是,請進行適當的性能測試以衡量和減輕影響。

如何查找我的應用程序是在32位還是64位JVM上運行?


方法一:在命令提示符下,發出命令:

java -version

如果是64位JVM,你將看到輸出包含單詞:“64-Bit”。例:

java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

如果它是32位JVM,則不會顯示單詞:“64-Bit”。例:

java version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) Client VM (build 25.211-b12, mixed mode)

方法二:你從Java程序發出以下語句:

System.out.println(System.getProperty("sun.arch.data.model") + "-bit JVM");

根據JVM類型,適當的版本將被打印在控制檯上。

我可以在64位操作系統上運行32位JVM嗎?

有32位OS和64位OS。如果你在32位操作系統上運行(這在今天很難找到),則只能運行32位JVM。另一方面,如果你在64位操作系統上運行,則可以在32位JVM或64位JVM上運行應用程序。

如何下載32位JVM或64位JVM?

轉到Oracle JDK下載頁面時,將看到用於下載特定於你的操作系統的JDK的選項:

32、64位JVM區分不再重要嗎?

如果你選擇x86,則將在此處下載32位JVM。如果選擇x64,則將下載64位JVM。

在32位JVM上編譯的代碼可以在64位JVM上運行嗎?

我們使用javac即java編譯器將Java代碼編譯為字節代碼(即* .class文件)。生成的字節碼與32位和64位JVM無關。它可以在兩個JVM上運行。記住Java古老的諾言:“Write once, run anywhere”。


分享到:


相關文章: