使用Java編程時(shí),考慮到終寫成程序的執(zhí)行效率,可能在選擇直接使用Java堆new對(duì)象,或是直接分配本地內(nèi)存之間很難做出決定。粵嵌武漢Java培訓(xùn)來(lái)對(duì)比下Java堆與本地內(nèi)存。
使用Java的一個(gè)好處就是你可以不用親自來(lái)管理內(nèi)存的分配和釋放。當(dāng)你用new關(guān)鍵字來(lái)實(shí)例化一個(gè)對(duì)象時(shí),它所需的內(nèi)存會(huì)自動(dòng)的在Java堆中分配。堆會(huì)被垃圾回收器進(jìn)行管理,并且它會(huì)在對(duì)象超出作用域時(shí)進(jìn)行內(nèi)存回收。但是在JVM中有一個(gè)‘后門’可以讓你訪問(wèn)不在堆中的本地內(nèi)存(native memory)。
使用Unsafe來(lái)分配和回收內(nèi)存
sun.misc.Unsafe可以讓你在Java中分配和回收本地內(nèi)存,就像C語(yǔ)言中的malloc和free。通過(guò)它分配的內(nèi)存不在Java堆中,并且不受垃圾回收器的管理,因此在它被使用完的時(shí)候你需要自己來(lái)負(fù)責(zé)釋放和回收。
跨越JVM的屏障來(lái)讀本地內(nèi)存大約會(huì)比直接讀Java堆中的內(nèi)存慢10倍,而對(duì)于寫操作會(huì)慢大約2倍。但是需要注意的是,由于每一個(gè)SomeMemoryObject對(duì)象所管理的本地內(nèi)存空間都是獨(dú)立的,因此讀寫操作都不是連續(xù)的。那么粵嵌武漢Java培訓(xùn)接下來(lái)就來(lái)對(duì)比下讀寫連續(xù)的內(nèi)存空間的性能。
訪問(wèn)一大塊的連續(xù)內(nèi)存空間
在做連續(xù)訪問(wèn)的時(shí)候,Java堆內(nèi)存通常都比本地內(nèi)存要快。對(duì)于隨機(jī)地址訪問(wèn),堆內(nèi)存僅僅比本地內(nèi)存慢一點(diǎn)點(diǎn),并且是針對(duì)大塊連續(xù)數(shù)據(jù)的時(shí)候,而且沒(méi)有慢很多。
的結(jié)論
在Java中使用本地內(nèi)存有它的意義,比如當(dāng)你要操作大塊的數(shù)據(jù)時(shí)(>2G)并且不想使用垃圾回收器(GC)的時(shí)候。從延遲的角度來(lái)說(shuō),直接訪問(wèn)本地內(nèi)存不會(huì)比訪問(wèn)Java堆快。這個(gè)結(jié)論其實(shí)是有道理的,因?yàn)榭缭?/span>JVM屏障肯定是有開銷的。這樣的結(jié)論對(duì)使用本地還是堆的ByteBuffer同樣適用。使用本地ByteBuffer的速度提升不在于訪問(wèn)這些內(nèi)存,而是它可以直接與操作系統(tǒng)提供的本地IO進(jìn)行操作。
粵嵌武漢Java培訓(xùn)認(rèn)為,事實(shí)上使用Java寫的程序,經(jīng)過(guò)編譯器編譯打亂后很可能已經(jīng)不是自己所想象的樣子了,畢竟Java是面向?qū)ο蟮恼Z(yǔ)言,所以更多的時(shí)候還不如怎么寫得快就怎么寫,畢竟編譯器在很多時(shí)候都不太聰明,我們自以為寫的很直接的程序也有可能編譯成亂糟糟的復(fù)雜的機(jī)器語(yǔ)言。