當(dāng)前位置:工程項目OA系統(tǒng) > 泛普各地 > 遼寧OA系統(tǒng) > 沈陽OA系統(tǒng) > 沈陽OA行業(yè)資訊
深入Java對象和元素的存儲區(qū)域
在JAVA平臺上開發(fā)應(yīng)用程序的時候,有一個很大的特點就是其是在應(yīng)用程序運行的時候才建立對象。換句話說,在程序運行的時候,才會最終確定對象的歸屬,即對象應(yīng)該存儲在什么地方。由于存儲在不同的區(qū)域,其在性能上會有所不同。為此作為Java程序開發(fā)人員需要了解各個存儲區(qū)域的特點以及對性能的影響。然后再根據(jù)需要來調(diào)整應(yīng)用程序的區(qū)域分配。總的來說,在操作系統(tǒng)中有五個地方可以用來保存應(yīng)用程序運行中的數(shù)據(jù)。這類區(qū)域的特點以及對性能的影響分析如下。
存儲區(qū)域一:寄存器
雖然同在內(nèi)存中,但是不同的區(qū)域由于用途不同,其性能也有所不同。如就拿Java應(yīng)用程序來說,寄存器由于其處于處理器的內(nèi)部,為此這個區(qū)域存取數(shù)據(jù)最快。跟內(nèi)存中的其他存儲區(qū)域有著天壤之別。那么我們把所有對象都放到這個區(qū)域內(nèi),不就可以提高Java應(yīng)用程序的性能了嗎?理論上是如此,但是在現(xiàn)實中是行不通的。因為這個寄存器的數(shù)量是非常有限的。在內(nèi)存中的寄存器區(qū)域是由編譯器根據(jù)需要來分配的。我們程序開發(fā)人員不能夠通過代碼來控制這個寄存器的分配。所以說,這第一個存儲區(qū)域寄存器,我們只能夠看看,而不能夠?qū)ζ洚a(chǎn)生任何的影響。
存儲區(qū)域二:堆棧
對象的創(chuàng)建有兩種方式,一是在應(yīng)用程序開發(fā)的過程中就創(chuàng)建對象;二是在程序運行的過程中要用到對象的時候再來創(chuàng)建對象。前者比后者性能要高,而后者比前者要靈活。這主要是因為前者創(chuàng)建對象的時候,就是這個堆棧中創(chuàng)建的。雖然其創(chuàng)建的對象沒有保存在寄存器中,但是通過這個對象的推棧指針可以直接從處理器哪里獲得相關(guān)的支持。如堆棧指針往上移動的時候,則釋放原有對象占用的內(nèi)存;如堆棧指針向下移動時,則為對象分配新的內(nèi)存。所以,如果把對象存放在這個堆棧中,雖然性能沒有像存放在寄存器中那么理想,但是仍然比存儲在其他地方要好的多。
由于Java程序是在程序運行過程中才根據(jù)需要來創(chuàng)建對象。為此對象就不能夠保存在這個堆棧中。不過Java應(yīng)用程序也不能夠白白的浪費這個寶貴的空間。為此雖然Java對象本身沒有保存在這個堆棧中(不是不保存而是這里沒有他的容身之地),但是還是應(yīng)該把一些可以放的內(nèi)容放到這個堆棧中,以提高應(yīng)用程序的性能。如可以把一些對象引用存放在這個堆棧中。
另外對于一些基本的數(shù)據(jù)類型對象,Java程序也往往把他們放置在堆棧中,以提高數(shù)據(jù)處理的性能。如一些整數(shù)型、字符型的數(shù)據(jù)對象,這些對象有些共同的特點,如對象比較小、是Java程序提供的標(biāo)準(zhǔn)對象等等。對于這些對象由于每個應(yīng)用程序基本上都需要用到,而且我們程序開發(fā)人員只能夠引用這些對象,而不能夠?qū)ζ溥M行更改。為此Java程序在處理的時候,往往一開始就創(chuàng)建了對象(即直接在堆棧中創(chuàng)建對象并保存),而不像其他對象一樣,在需要的時候才創(chuàng)建。只所以在堆棧中創(chuàng)建這些對象,還有一個重要的原因。因為如果在堆棧中創(chuàng)建對象的話,Java編輯器必須知道存儲在堆棧內(nèi)所有數(shù)據(jù)的確切大小和生命周期。為了得到這些信息,必須產(chǎn)生相關(guān)的代碼來獲得這些信息,以便其操作堆棧指針。普通的對象大小、生命周期等等難以預(yù)先獲得,為此在堆棧中創(chuàng)建普通的對象,對于Java應(yīng)用程序來說并不是很合適。相反,這些Java編譯器預(yù)定義的對象大小并不會隨著機器硬件架構(gòu)的變化和用戶需求的變化而變化;而且這些對象往往從始之終都會存在的,所以也不存在生命周期的問題。所以把這些對象放置在堆棧中是合理的,也是可實現(xiàn)的。如此處理,不僅不會影響到對象的靈活性,而且還可以提供比較好的性能。
存儲區(qū)域三:堆
堆雖然跟堆棧一樣,都是隨機訪問存儲器中的區(qū)域,但是兩者有很大的不同。因為在堆中,沒有堆棧指針,為此也就無法直接從處理器那邊獲得支持。為此其性能跟堆棧比起來,就有一定的差距。通常情況下,除上面所說的一些預(yù)定義對象之外,其他的對象都是保存在這個堆中的?;蛘哒f,利用new關(guān)鍵字創(chuàng)建的對象都是保存在堆中的。保存在堆中其好處也是顯而易見的。如Java編譯器不需要知道從堆里需要分配多少存儲區(qū)域,也不必知道存儲的數(shù)據(jù)在堆里會存活多長時間。所以在堆里分配存儲有很大的靈活性。當(dāng)需要對象時,我們可以使用New關(guān)鍵字建立一個對象。然后系統(tǒng)會自動給這個對象在堆中分配一個區(qū)域讓其作為歸宿。不過其最大的不足之處,就是在堆中創(chuàng)建對象與分配存儲區(qū)域,要比在堆棧中慢許多。魚與熊掌不能兼得呀。
存儲區(qū)域四:靜態(tài)存儲區(qū)域與常量存儲區(qū)域
在Java對象中有一些特殊的元素。如有些元素是比較特別的(如利用關(guān)鍵字Static定義的變量)。這些變量對于其他對象來說,可能就是靜態(tài)的。為了更好的管理這些變量,Java在內(nèi)存中專門劃分了一個靜態(tài)存儲區(qū)域來管理這些元素。這里的靜態(tài)存儲區(qū)域就是指在固定的位置存放應(yīng)用程序運行時一直存在的數(shù)據(jù)。這里需要明確的一點就是,Java對象是不保存在這個地方的,而只是把對象中的一些特殊元素放置這里。由于位置固定,所以下次調(diào)用的時候就省去了查找的麻煩。為此其對于提供應(yīng)用程序的性能是有利的。作為我們程序開發(fā)人員來說,在書寫代碼的時候,就需要靈活應(yīng)用Static這個關(guān)鍵字。筆者的意見是,能用則用;不能用的時候也要想著法兒用。特別是有些元素用不用Static關(guān)鍵字時對于程序功能沒有影響,此時我們要理直氣壯的在元素前面加上Static關(guān)鍵字。
在Java對象中還有一類特殊的元素,我們叫做常量。由于常量的值是穩(wěn)定不變的,如圓周率。為此把他們放在代碼的內(nèi)部是可行的。不過有些時候,在進行一些嵌入式系統(tǒng)開發(fā)的時候,我們往往不這么做。而是會把常量元素跟代碼分開來保存。如我們會根據(jù)情況把常量的值存放在一些只讀存儲器中。這主要是為了一些特殊的功能考慮的。如出于版權(quán)控制的需要。如在打印機上為了保護原裝耗材的版權(quán),往往把常量跟代碼分開存放。
存儲區(qū)域五:非RAM存儲
有時候,有些程序運行所需要的數(shù)據(jù)我們還會放置在其他地方。如在一些系統(tǒng)中需要用到流對象,這個對象的數(shù)據(jù)并沒有保存在上面所談到的任何一個存儲區(qū)域,這個對象直接被轉(zhuǎn)為為字節(jié)流,發(fā)送到其他的主機上去了。另外有一種叫做持久化的對象,其是被存儲在硬盤中的。這些對象平時在應(yīng)用程序開發(fā)過程中用到的并不是很多,大家只需要了解有這些對象的存在即可。等到需要用到的時候,再去深入研究也不遲。
從上面的分析中我們可以看到,對象的歸屬我們程序開發(fā)人員很難控制。寄存器是編譯器來管理的。而堆與堆棧又基本上受到開發(fā)平臺的限制,我們程序人員也沒有這個能耐來干涉他們。其實我們主要能夠調(diào)整與控制的就是第四個存儲區(qū)域,即靜態(tài)存儲與常量存儲。筆者的建議是,對于非嵌入式程序,能夠利用靜態(tài)存儲來實現(xiàn)的,就盡量采用靜態(tài)存儲。而對于常量來說,需要根據(jù)需要實現(xiàn)的功能來判斷是否需要把常量存儲在只讀存儲器中。有時候?qū)τ诎鏅?quán)的保護等等需要用到這個只讀存儲器。(來自互聯(lián)網(wǎng))
- 1盤點數(shù)據(jù)保護方式看中小企業(yè)信息安全
- 2存儲虛擬化最佳實施 路在何方?
- 3OA辦公系統(tǒng)流程審批自由流程解析
- 4房地產(chǎn)建筑風(fēng)格定位、主力戶型選擇等功能介紹
- 5采用上網(wǎng)本處理器的服務(wù)器或成為新市場
- 6分析:云計算應(yīng)用的四個重要障礙
- 7數(shù)據(jù)中心工作人員的健康與安全誰來管
- 8分析:七步解決服務(wù)器I/O成本問題
- 9從云計算談IT系統(tǒng)建設(shè)的新思路和新方法
- 10闖過8個關(guān)口 保你的SOA計劃大獲成功
- 11云計算時代的企業(yè)如何把握IT建設(shè)
- 12虛擬化技術(shù)先進的背后并非完美無缺
- 13現(xiàn)代數(shù)據(jù)中心面臨的四大變革
- 14云計算五大支柱 動態(tài)計算基礎(chǔ)設(shè)施是關(guān)鍵
- 15那些是適用于中小企業(yè)的HR解決方案
- 16關(guān)于安全行業(yè)預(yù)防“流感”十個問題
- 17云備份市場 服務(wù)商多種方式吸引用戶
- 18“云安全+云保護” 謎團技術(shù)解析
- 19云計算市場:非瀏覽器終端的存在
- 20淺析云計算安全的法律弊端
- 21降低服務(wù)器虛擬化的四大安全風(fēng)險
- 22虛擬化技術(shù)在5個層面的應(yīng)用
- 23云計算的“智慧”:讓數(shù)字開口說話
- 24如何使用虛擬化里的高級NAS功能?
- 25IT業(yè)未來做什么最賺錢
- 26NAS如何助中小型超市構(gòu)建異地容災(zāi)系統(tǒng)
- 27云計算取勝的關(guān)鍵:標(biāo)準(zhǔn)人才運營及其他
- 2830年信息安全發(fā)展歷程的十大里程碑
- 29如何利用現(xiàn)有設(shè)施部署安全的無線網(wǎng)絡(luò)?
- 30以色列國防部老兵看云計算的安全問題
成都公司:成都市成華區(qū)建設(shè)南路160號1層9號
重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓