国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
深入Java對(duì)象及元素的存儲(chǔ)區(qū)域

深入Java對(duì)象及元素的存儲(chǔ)區(qū)域

巧巧讀書(shū) 2009-05-27 luobo IT專家網(wǎng)  技術(shù)論壇

51CTO推薦:Java程序員,你為什么要關(guān)注Scala?

在JAVA平臺(tái)上開(kāi)發(fā)應(yīng)用程序的時(shí)候,有一個(gè)很大的特點(diǎn)就是其是在應(yīng)用程序運(yùn)行的時(shí)候才建立對(duì)象。換句話說(shuō),在程序運(yùn)行的時(shí)候,才會(huì)最終確定對(duì)象的歸屬,即對(duì)象應(yīng)該存儲(chǔ)在什么地方。由于存儲(chǔ)在不同的區(qū)域,其在性能上會(huì)有所不同。為此作為Java程序開(kāi)發(fā)人員需要了解各個(gè)存儲(chǔ)區(qū)域的特點(diǎn)以及對(duì)性能的影響。然后再根據(jù)需要來(lái)調(diào)整應(yīng)用程序的區(qū)域分配??偟膩?lái)說(shuō),在操作系統(tǒng)中有五個(gè)地方可以用來(lái)保存應(yīng)用程序運(yùn)行中的數(shù)據(jù)。這類區(qū)域的特點(diǎn)以及對(duì)性能的影響分析如下。

存儲(chǔ)區(qū)域一:寄存器

雖然同在內(nèi)存中,但是不同的區(qū)域由于用途不同,其性能也有所不同。如就拿Java應(yīng)用程序來(lái)說(shuō),寄存器由于其處于處理器的內(nèi)部,為此這個(gè)區(qū)域存取數(shù)據(jù)最快。跟內(nèi)存中的其他存儲(chǔ)區(qū)域有著天壤之別。那么我們把所有對(duì)象都放到這個(gè)區(qū)域內(nèi),不就可以提高Java應(yīng)用程序的性能了嗎?理論上是如此,但是在現(xiàn)實(shí)中是行不通的。因?yàn)檫@個(gè)寄存器的數(shù)量是非常有限的。在內(nèi)存中的寄存器區(qū)域是由編譯器根據(jù)需要來(lái)分配的。我們程序開(kāi)發(fā)人員不能夠通過(guò)代碼來(lái)控制這個(gè)寄存器的分配。所以說(shuō),這第一個(gè)存儲(chǔ)區(qū)域寄存器,我們只能夠看看,而不能夠?qū)ζ洚a(chǎn)生任何的影響。

存儲(chǔ)區(qū)域二:堆棧

對(duì)象的創(chuàng)建有兩種方式,一是在應(yīng)用程序開(kāi)發(fā)的過(guò)程中就創(chuàng)建對(duì)象;二是在程序運(yùn)行的過(guò)程中要用到對(duì)象的時(shí)候再來(lái)創(chuàng)建對(duì)象。前者比后者性能要高,而后者比前者要靈活。這主要是因?yàn)榍罢邉?chuàng)建對(duì)象的時(shí)候,就是這個(gè)堆棧中創(chuàng)建的。雖然其創(chuàng)建的對(duì)象沒(méi)有保存在寄存器中,但是通過(guò)這個(gè)對(duì)象的推棧指針可以直接從處理器哪里獲得相關(guān)的支持。如堆棧指針往上移動(dòng)的時(shí)候,則釋放原有對(duì)象占用的內(nèi)存;如堆棧指針向下移動(dòng)時(shí),則為對(duì)象分配新的內(nèi)存。所以,如果把對(duì)象存放在這個(gè)堆棧中,雖然性能沒(méi)有像存放在寄存器中那么理想,但是仍然比存儲(chǔ)在其他地方要好的多。

由于Java程序是在程序運(yùn)行過(guò)程中才根據(jù)需要來(lái)創(chuàng)建對(duì)象。為此對(duì)象就不能夠保存在這個(gè)堆棧中。不過(guò)Java應(yīng)用程序也不能夠白白的浪費(fèi)這個(gè)寶貴的空間。為此雖然Java對(duì)象本身沒(méi)有保存在這個(gè)堆棧中(不是不保存而是這里沒(méi)有他的容身之地),但是還是應(yīng)該把一些可以放的內(nèi)容放到這個(gè)堆棧中,以提高應(yīng)用程序的性能。如可以把一些對(duì)象引用存放在這個(gè)堆棧中。

另外對(duì)于一些基本的數(shù)據(jù)類型對(duì)象,Java程序也往往把他們放置在堆棧中,以提高數(shù)據(jù)處理的性能。如一些整數(shù)型、字符型的數(shù)據(jù)對(duì)象,這些對(duì)象有些共同的特點(diǎn),如對(duì)象比較小、是Java程序提供的標(biāo)準(zhǔn)對(duì)象等等。對(duì)于這些對(duì)象由于每個(gè)應(yīng)用程序基本上都需要用到,而且我們程序開(kāi)發(fā)人員只能夠引用這些對(duì)象,而不能夠?qū)ζ溥M(jìn)行更改。為此Java程序在處理的時(shí)候,往往一開(kāi)始就創(chuàng)建了對(duì)象(即直接在堆棧中創(chuàng)建對(duì)象并保存),而不像其他對(duì)象一樣,在需要的時(shí)候才創(chuàng)建。只所以在堆棧中創(chuàng)建這些對(duì)象,還有一個(gè)重要的原因。因?yàn)槿绻诙褩V袆?chuàng)建對(duì)象的話,Java編輯器必須知道存儲(chǔ)在堆棧內(nèi)所有數(shù)據(jù)的確切大小和生命周期。為了得到這些信息,必須產(chǎn)生相關(guān)的代碼來(lái)獲得這些信息,以便其操作堆棧指針。普通的對(duì)象大小、生命周期等等難以預(yù)先獲得,為此在堆棧中創(chuàng)建普通的對(duì)象,對(duì)于Java應(yīng)用程序來(lái)說(shuō)并不是很合適。相反,這些Java編譯器預(yù)定義的對(duì)象大小并不會(huì)隨著機(jī)器硬件架構(gòu)的變化和用戶需求的變化而變化;而且這些對(duì)象往往從始之終都會(huì)存在的,所以也不存在生命周期的問(wèn)題。所以把這些對(duì)象放置在堆棧中是合理的,也是可實(shí)現(xiàn)的。如此處理,不僅不會(huì)影響到對(duì)象的靈活性,而且還可以提供比較好的性能。

存儲(chǔ)區(qū)域三:堆

堆雖然跟堆棧一樣,都是隨機(jī)訪問(wèn)存儲(chǔ)器中的區(qū)域,但是兩者有很大的不同。因?yàn)樵诙阎?,沒(méi)有堆棧指針,為此也就無(wú)法直接從處理器那邊獲得支持。為此其性能跟堆棧比起來(lái),就有一定的差距。通常情況下,除上面所說(shuō)的一些預(yù)定義對(duì)象之外,其他的對(duì)象都是保存在這個(gè)堆中的?;蛘哒f(shuō),利用new關(guān)鍵字創(chuàng)建的對(duì)象都是保存在堆中的。保存在堆中其好處也是顯而易見(jiàn)的。如Java編譯器不需要知道從堆里需要分配多少存儲(chǔ)區(qū)域,也不必知道存儲(chǔ)的數(shù)據(jù)在堆里會(huì)存活多長(zhǎng)時(shí)間。所以在堆里分配存儲(chǔ)有很大的靈活性。當(dāng)需要對(duì)象時(shí),我們可以使用New關(guān)鍵字建立一個(gè)對(duì)象。然后系統(tǒng)會(huì)自動(dòng)給這個(gè)對(duì)象在堆中分配一個(gè)區(qū)域讓其作為歸宿。不過(guò)其最大的不足之處,就是在堆中創(chuàng)建對(duì)象與分配存儲(chǔ)區(qū)域,要比在堆棧中慢許多。魚(yú)與熊掌不能兼得呀。

存儲(chǔ)區(qū)域四:靜態(tài)存儲(chǔ)區(qū)域與常量存儲(chǔ)區(qū)域

在Java對(duì)象中有一些特殊的元素。如有些元素是比較特別的(如利用關(guān)鍵字Static定義的變量)。這些變量對(duì)于其他對(duì)象來(lái)說(shuō),可能就是靜態(tài)的。為了更好的管理這些變量,Java在內(nèi)存中專門劃分了一個(gè)靜態(tài)存儲(chǔ)區(qū)域來(lái)管理這些元素。這里的靜態(tài)存儲(chǔ)區(qū)域就是指在固定的位置存放應(yīng)用程序運(yùn)行時(shí)一直存在的數(shù)據(jù)。這里需要明確的一點(diǎn)就是,Java對(duì)象是不保存在這個(gè)地方的,而只是把對(duì)象中的一些特殊元素放置這里。由于位置固定,所以下次調(diào)用的時(shí)候就省去了查找的麻煩。為此其對(duì)于提供應(yīng)用程序的性能是有利的。作為我們程序開(kāi)發(fā)人員來(lái)說(shuō),在書(shū)寫代碼的時(shí)候,就需要靈活應(yīng)用Static這個(gè)關(guān)鍵字。筆者的意見(jiàn)是,能用則用;不能用的時(shí)候也要想著法兒用。特別是有些元素用不用Static關(guān)鍵字時(shí)對(duì)于程序功能沒(méi)有影響,此時(shí)我們要理直氣壯的在元素前面加上Static關(guān)鍵字。

在Java對(duì)象中還有一類特殊的元素,我們叫做常量。由于常量的值是穩(wěn)定不變的,如圓周率。為此把他們放在代碼的內(nèi)部是可行的。不過(guò)有些時(shí)候,在進(jìn)行一些嵌入式系統(tǒng)開(kāi)發(fā)的時(shí)候,我們往往不這么做。而是會(huì)把常量元素跟代碼分開(kāi)來(lái)保存。如我們會(huì)根據(jù)情況把常量的值存放在一些只讀存儲(chǔ)器中。這主要是為了一些特殊的功能考慮的。如出于版權(quán)控制的需要。如在打印機(jī)上為了保護(hù)原裝耗材的版權(quán),往往把常量跟代碼分開(kāi)存放。

存儲(chǔ)區(qū)域五:非RAM存儲(chǔ)

有時(shí)候,有些程序運(yùn)行所需要的數(shù)據(jù)我們還會(huì)放置在其他地方。如在一些系統(tǒng)中需要用到流對(duì)象,這個(gè)對(duì)象的數(shù)據(jù)并沒(méi)有保存在上面所談到的任何一個(gè)存儲(chǔ)區(qū)域,這個(gè)對(duì)象直接被轉(zhuǎn)為為字節(jié)流,發(fā)送到其他的主機(jī)上去了。另外有一種叫做持久化的對(duì)象,其是被存儲(chǔ)在硬盤中的。這些對(duì)象平時(shí)在應(yīng)用程序開(kāi)發(fā)過(guò)程中用到的并不是很多,大家只需要了解有這些對(duì)象的存在即可。等到需要用到的時(shí)候,再去深入研究也不遲。

從上面的分析中我們可以看到,對(duì)象的歸屬我們程序開(kāi)發(fā)人員很難控制。寄存器是編譯器來(lái)管理的。而堆與堆棧又基本上受到開(kāi)發(fā)平臺(tái)的限制,我們程序人員也沒(méi)有這個(gè)能耐來(lái)干涉他們。其實(shí)我們主要能夠調(diào)整與控制的就是第四個(gè)存儲(chǔ)區(qū)域,即靜態(tài)存儲(chǔ)與常量存儲(chǔ)。筆者的建議是,對(duì)于非嵌入式程序,能夠利用靜態(tài)存儲(chǔ)來(lái)實(shí)現(xiàn)的,就盡量采用靜態(tài)存儲(chǔ)。而對(duì)于常量來(lái)說(shuō),需要根據(jù)需要實(shí)現(xiàn)的功能來(lái)判斷是否需要把常量存儲(chǔ)在只讀存儲(chǔ)器中。有時(shí)候?qū)τ诎鏅?quán)的保護(hù)等等需要用到這個(gè)只讀存儲(chǔ)器。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Java中堆、棧、常量池等概念解析
Java面試相關(guān)——堆和棧-簡(jiǎn)書(shū)
第五章Java虛擬機(jī)(Chapter Five: The Java Virtual Mac...
淺談Java中數(shù)據(jù)在內(nèi)存中的狀態(tài),以及String、StringBuffer、==、equals、數(shù)組等問(wèn)題
JVM內(nèi)存區(qū)域劃分
Java編程思想第二章一切皆對(duì)象
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服