32、64位JVM區(qū)分不再重要嗎?

簡(jiǎn)介

在本文中找到有關(guān)于32位JVM和64位JVM之間的區(qū)別的一些常見(jiàn)問(wèn)題的答案。你將學(xué)到在這兩者之間進(jìn)行遷移時(shí)要考慮的所有事情,將有助于你更好地實(shí)施。

32位JVM和64位JVM之間存在一些明顯的區(qū)別和細(xì)微差別。我將嘗試通過(guò)此問(wèn)答文章來(lái)澄清它們。

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

如果你不是在構(gòu)建性能型Java服務(wù),則不必了解它們之間的區(qū)別。32位JVM和64位JVM之間的細(xì)微差別不會(huì)對(duì)你的Java服務(wù)產(chǎn)生太大影響。

64位JVM的性能是否優(yōu)于32位JVM?

我們大多數(shù)人認(rèn)為64位大于32位,因此64位JVM性能將優(yōu)于32位JVM性能。其實(shí)不然,事實(shí)并非如此。與32位JVM相比,64位JVM的性能可能會(huì)有所下降。以下是Oracle JDK文檔中有關(guān)64位JVM性能的摘錄:

`
通常,與在32位VM上運(yùn)行同一應(yīng)用程序相比,能夠處理大量?jī)?nèi)存的好處是64位VM的性能損失較小。當(dāng)你遷移到64位VM時(shí),將在64位平臺(tái)上運(yùn)行的應(yīng)用程序與在SPARC上的32位平臺(tái)運(yùn)行的應(yīng)用程序相比,性能差異降低了10-20%。在AMD64和EM64T平臺(tái)上,此差異范圍為0-15%,具體取決于訪問(wèn)應(yīng)用程序所執(zhí)行的指針的數(shù)量。”

如果性能受到影響,為什么有人會(huì)使用64位JVM?

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

操作系統(tǒng) 最大堆
AIX 3.25 GB
Solaris 2 ~ 4 GB
Linux 2 ~ 3 GB
Windows 1.5 GB
Mac OS X 3.8 GB

而如果你在64位JVM上運(yùn)行應(yīng)用程序,則最大可尋址內(nèi)存空間為2 ^ 64(即... 沒(méi)算出來(lái)--_--)。這意味著你的應(yīng)用程序的最大可尋址內(nèi)存大小接近無(wú)限。
`

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

這是由于以下事實(shí):系統(tǒng)中的每個(gè)本機(jī)指針占用的是8個(gè)字節(jié)而不是4個(gè)字節(jié)。此額外數(shù)據(jù)的加載對(duì)內(nèi)存使用有影響,這取決于執(zhí)行過(guò)程中加載了多少個(gè)指針,從而導(dǎo)致執(zhí)行速度稍慢。

好消息是,由于以64位模式運(yùn)行的AMD64和EM64T平臺(tái),Java VM獲得了一些額外的寄存器,可用于生成更有效的本機(jī)指令序列。比較32位和64位執(zhí)行速度時(shí),這些額外的寄存器將性能提高到通常根本沒(méi)有性能損失的地步。

從32位JVM遷移到64位JVM時(shí)需要考慮哪些事項(xiàng)?

GC Stop World時(shí)間

從32位JVM遷移到64位JVM的主要原因是要獲得較大的堆大小(即-Xmx)。當(dāng)增加堆大小時(shí),GC暫停時(shí)間會(huì)自動(dòng)開(kāi)始變長(zhǎng),因?yàn)楝F(xiàn)在內(nèi)存中有更多垃圾需要清除。在進(jìn)行遷移之前,你需要進(jìn)行適當(dāng)?shù)腉C調(diào)整,否則,你的應(yīng)用程序可能會(huì)經(jīng)歷幾秒鐘到幾分鐘的暫停時(shí)間。于此同時(shí),有一個(gè)專門的GC分析網(wǎng)站可以供你去配置使用GCeasy

Native library

如果你的應(yīng)用程序使用Java本機(jī)接口(JNI)訪問(wèn)本機(jī)庫(kù),那么你還需要升級(jí)Native library,因?yàn)?2位JVM只能使用32位Native library。同樣,64位JVM只能使用64位Native library。

什么是CompressedOops?它與32位,64位JVM有關(guān)嗎?

image.png

是的,CompressedOOps與32位和64位JVM有關(guān)。

我們用數(shù)據(jù)字段定義對(duì)象。當(dāng)在內(nèi)存中創(chuàng)建該對(duì)象以及數(shù)據(jù)字段時(shí),還將創(chuàng)建對(duì)象標(biāo)頭。JVM需要對(duì)象標(biāo)頭來(lái)執(zhí)行內(nèi)部處理,虛擬方法調(diào)用,垃圾回收,鎖定等。

在32位JVM中,此對(duì)象標(biāo)頭占用8個(gè)字節(jié);在64 位JVM中,該對(duì)象標(biāo)頭占用16個(gè)字節(jié)。增加8個(gè)字節(jié)聽(tīng)起來(lái)可能并不多,但是鑒于你的應(yīng)用程序在其運(yùn)行時(shí)創(chuàng)建了數(shù)百萬(wàn)個(gè)對(duì)象,將8個(gè)字節(jié)乘以數(shù)百萬(wàn)個(gè)對(duì)象可能會(huì)增加可觀的開(kāi)銷。

你可以通過(guò)傳遞XX:+ UseCompressedOops JVM參數(shù)來(lái)緩解此問(wèn)題。當(dāng)你傳遞此參數(shù)時(shí),JVM會(huì)做出一個(gè)巧妙的技巧,并將對(duì)象標(biāo)頭的大小優(yōu)化為即使在64位中也僅使用12個(gè)字節(jié)。只要你的JVM堆大小(即-Xmx)小于32GB,此技巧就會(huì)起作用。如果超過(guò)32 GB,則對(duì)象標(biāo)頭大小將再次變?yōu)?6個(gè)字節(jié)。

注意:自Java SE 6u23及更高版本以來(lái),已將-XX:+ UseCompressedOops設(shè)置為默認(rèn)值。僅當(dāng)你在JDK 6u23或更早版本上運(yùn)行時(shí),才傳遞-XX:+ UseCompressedOopsargument。

什么時(shí)候應(yīng)該使用32位和64位JVM?

<2GB內(nèi)存:如果你的應(yīng)用程序的堆大小(即-Xmx)小于2GB,則無(wú)需費(fèi)力地決定。使用32位JVM。

> 2GB內(nèi)存:如果你的應(yīng)用程序需要2GB以上的內(nèi)存,那也不是明智的決定。使用64位JVM。但是,請(qǐng)進(jìn)行適當(dāng)?shù)男阅軠y(cè)試以衡量和減輕影響。

如何查找我的應(yīng)用程序是在32位還是64位JVM上運(yùn)行?

有一些選擇。讓我展示幾個(gè)選擇:

方法一:在命令提示符下,發(fā)出命令:

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,則不會(huì)顯示單詞:“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程序發(fā)出以下語(yǔ)句:

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

根據(jù)JVM類型,適當(dāng)?shù)陌姹緦⒈淮蛴≡诳刂婆_(tái)上。

我可以在64位操作系統(tǒng)上運(yùn)行32位JVM嗎?

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

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

轉(zhuǎn)到Oracle JDK下載頁(yè)面時(shí),將看到用于下載特定于你的操作系統(tǒng)的JDK的選項(xiàng):

image.png

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

在32位JVM上編譯的代碼可以在64位JVM上運(yùn)行嗎?

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,748評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,165評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 175,595評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 62,633評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,435評(píng)論 6 405
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 54,943評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,035評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 42,175評(píng)論 0 287
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,713評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,599評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,788評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,303評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,034評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 34,412評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 35,664評(píng)論 1 280
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,408評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,747評(píng)論 2 370

推薦閱讀更多精彩內(nèi)容

  • 又是一年秋招季,哎呀媽呀我被虐的慘來(lái)~這不,前幾陣失蹤沒(méi)更新博客,其實(shí)是我偷偷把時(shí)間用在復(fù)習(xí)課本了(霧 堅(jiān)持在社區(qū)...
    tengshe789閱讀 2,024評(píng)論 0 8
  • 所有知識(shí)點(diǎn)已整理成app app下載地址 J2EE 部分: 1.Switch能否用string做參數(shù)? 在 Jav...
    侯蛋蛋_閱讀 2,471評(píng)論 1 4
  • 抽象,繼承,封裝,多態(tài) 下面將一一解釋.抽象是將一類對(duì)象的共同特征總結(jié)出來(lái)構(gòu)造類的過(guò)程.包括數(shù)據(jù)抽象和行為抽象兩部...
    高珊珊aim閱讀 961評(píng)論 0 0
  • 第二部分 自動(dòng)內(nèi)存管理機(jī)制 第二章 java內(nèi)存異常與內(nèi)存溢出異常 運(yùn)行數(shù)據(jù)區(qū)域 程序計(jì)數(shù)器:當(dāng)前線程所執(zhí)行的字節(jié)...
    小明oh閱讀 1,190評(píng)論 0 2
  • 敬愛(ài)的李老師,智慧的班主任,親愛(ài)的躍友們: 大家好!我是84號(hào)來(lái)自青島直路房產(chǎn)經(jīng)紀(jì)有限公司的鄭自召。 今...
    鄭自召閱讀 84評(píng)論 0 0