JVM 堆 VS 本地內(nèi)存

Java 的類實(shí)例一般在 JVM 堆上分配,而 Java 是通過 JNI 調(diào)用 C 代碼來實(shí)現(xiàn) Socket 通信的仰美,那么 C 代碼在運(yùn)行過程中需要的內(nèi)存又是從哪里分配的呢?C 代碼能否直接操作 Java 堆停士?

為了回答這些問題舅柜,我先來說說 JVM 和用戶進(jìn)程的關(guān)系。如果你想運(yùn)行一個(gè) Java 類文件但骨,可以用下面的 Java 命令來執(zhí)行

java my.class

這個(gè)命令行中的java其實(shí)是一個(gè)可執(zhí)行程序励七,這個(gè)程序會(huì)創(chuàng)建 JVM 來加載和運(yùn)行你的 Java 類

操作系統(tǒng)會(huì)創(chuàng)建一個(gè)進(jìn)程來執(zhí)行這個(gè)java可執(zhí)行程序奔缠,而每個(gè)進(jìn)程都有自己的虛擬地址空間掠抬,JVM 用到的內(nèi)存(包括堆、棧和方法區(qū))就是從進(jìn)程的虛擬地址空間上分配的校哎。請(qǐng)你注意的是两波,JVM 內(nèi)存只是進(jìn)程空間的一部分,除此之外進(jìn)程空間內(nèi)還有代碼段闷哆、數(shù)據(jù)段腰奋、內(nèi)存映射區(qū)、內(nèi)核空間等阳准。JVM 的角度看氛堕,JVM 內(nèi)存之外的部分叫作本地內(nèi)存,C 程序代碼在運(yùn)行過程中用到的內(nèi)存就是本地內(nèi)存中分配的野蝇。下面我們通過一張圖來理解一下讼稚。

那 HeapByteBuffer 和 DirectByteBuffer 有什么區(qū)別呢?HeapByteBuffer 對(duì)象本身在 JVM 堆上分配绕沈,并且它持有的字節(jié)數(shù)組byte[]也是在 JVM 堆上分配锐想。

但是如果用HeapByteBuffer來接收網(wǎng)絡(luò)數(shù)據(jù),需要把數(shù)據(jù)從內(nèi)核先拷貝到一個(gè)臨時(shí)的本地內(nèi)存乍狐,再從臨時(shí)本地內(nèi)存拷貝到 JVM 堆,而不是直接從內(nèi)核拷貝到 JVM 堆上赠摇。這是為什么呢?這是因?yàn)閿?shù)據(jù)從內(nèi)核拷貝到 JVM 堆的過程中,JVM 可能會(huì)發(fā)生 GC藕帜,GC 過程中對(duì)象可能會(huì)被移動(dòng)烫罩,也就是說 JVM 堆上的字節(jié)數(shù)組可能會(huì)被移動(dòng),這樣的話 Buffer 地址就失效了洽故。如果這中間經(jīng)過本地內(nèi)存中轉(zhuǎn)贝攒,從本地內(nèi)存到 JVM 堆的拷貝過程中 JVM 可以保證不做 GC。

如果使用 HeapByteBuffer时甚,你會(huì)發(fā)現(xiàn) JVM 堆和內(nèi)核之間多了一層中轉(zhuǎn)隘弊,而 DirectByteBuffer 用來解決這個(gè)問題,DirectByteBuffer 對(duì)象本身在 JVM 堆上,但是它持有的字節(jié)數(shù)組不是從 JVM 堆上分配的荒适,而是從本地內(nèi)存分配的梨熙。
DirectByteBuffer 對(duì)象中有個(gè) long 類型字段 address,記錄著本地內(nèi)存的地址刀诬,這樣在接收數(shù)據(jù)的時(shí)候咽扇,直接把這個(gè)本地內(nèi)存地址傳遞給 C 程序,C 程序會(huì)將網(wǎng)絡(luò)數(shù)據(jù)從內(nèi)核拷貝到這個(gè)本地內(nèi)存舅列,JVM 可以直接讀取這個(gè)本地內(nèi)存肌割,這種方式比 HeapByteBuffer 少了一次拷貝卧蜓,因此一般來說它的速度會(huì)比 HeapByteBuffer 快好幾倍帐要。你可以通過上面的圖加深理解。

那為什么DirectByteBuffer的性能比HeapByteBuffer差依然在使用呢弥奸?
這是因?yàn)楸镜貎?nèi)存不好管理榨惠,發(fā)生內(nèi)存泄漏難以定位,從穩(wěn)定性考慮盛霎,
HeapByteBuffer更好赠橙。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市愤炸,隨后出現(xiàn)的幾起案子期揪,更是在濱河造成了極大的恐慌,老刑警劉巖规个,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凤薛,死亡現(xiàn)場離奇詭異,居然都是意外死亡诞仓,警方通過查閱死者的電腦和手機(jī)缤苫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來墅拭,“玉大人活玲,你說我怎么就攤上這事。” “怎么了舒憾?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵镀钓,是天一觀的道長。 經(jīng)常有香客問我镀迂,道長掸宛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任招拙,我火速辦了婚禮唧瘾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘别凤。我一直安慰自己饰序,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布规哪。 她就那樣靜靜地躺著求豫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪诉稍。 梳的紋絲不亂的頭發(fā)上蝠嘉,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音杯巨,去河邊找鬼蚤告。 笑死,一個(gè)胖子當(dāng)著我的面吹牛服爷,可吹牛的內(nèi)容都是我干的杜恰。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼仍源,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼心褐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起笼踩,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤逗爹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后嚎于,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掘而,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年匾旭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了镣屹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡价涝,死狀恐怖女蜈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤伪窖,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布逸寓,位于F島的核電站,受9級(jí)特大地震影響覆山,放射性物質(zhì)發(fā)生泄漏竹伸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一勋篓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧魏割,春花似錦拜银、人聲如沸尼桶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谤碳。三九已至溃卡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蜒简,已是汗流浹背瘸羡。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留搓茬,地道東北人犹赖。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像卷仑,于是被迫代替她去往敵國和親峻村。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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