麻豆成人91精品二区三区,国产91在线播放,加勒比无码专区中文字幕,欧美黑人XXXX高潮猛交

×

析 JAVA虛擬機(jī)的棧與堆

  • 作者:新網(wǎng)
  • 來源:新網(wǎng)
  • 瀏覽:100
  • 2018-04-25 13:16:16

Java虛擬機(jī)中,數(shù)據(jù)類型可以分為兩類:基本類型和引用類型?;绢愋偷淖兞勘4嬖贾?,即:他代表的值就是數(shù)值本身;而引用類型的變量保存引用值。

 

  10545731.gif
<div>         Java虛擬機(jī)中,數(shù)據(jù)類型可以分為兩類:基本類型和引用類型。基本類型的變量保存原始值,即:他代表的值就是數(shù)值本身;而引用類型的變量保存引用值。
         “引用值”代表了某個對象的引用,而不是對象本身,對象本身存放在這個引用值所表示的地址的位置。
  基本類型包括:byte, short, int, long, char, float, double, boolean,
  引用類型包括:類,接口和數(shù)組。
  棧與堆1,什么是棧,什么是堆?
  堆和棧是程序運(yùn)行的關(guān)鍵。棧是運(yùn)行時的單位,棧解決程序的運(yùn)行問題,即程序如何執(zhí)行,或者說如何處理數(shù)據(jù)。而堆是存儲的單位,堆解決的是數(shù)據(jù)存儲的問題,即數(shù)據(jù)怎么放、放在哪兒。
  在Java中一個線程就會相應(yīng)有一個線程棧與之對應(yīng),因?yàn)椴煌木€程執(zhí)行邏輯有所不同,因此需要一個獨(dú)立的線程棧。而堆則是所有線程共享的。棧因?yàn)槭沁\(yùn)行單位,因此里面存儲的信息都是跟當(dāng)前線程(或程序)相關(guān)信息的。包括局部變量、程序運(yùn)行狀態(tài)、方法返回值等等;而堆只負(fù)責(zé)存儲對象信息。
  2,為什么要將棧與堆區(qū)分開?
  第一,從軟件設(shè)計的角度看,棧代表了處理邏輯,而堆代表了數(shù)據(jù)。這樣分開,使得處理邏輯更為清晰。分而治之的思想。這種隔離、模塊化的思想在軟件設(shè)計的方方面面都有體現(xiàn)。
  第二,堆與棧的分離,使得堆中的內(nèi)容可以被多個棧共享(也可以理解為多個線程訪問同一個對象)。這種共享的收益是很多的。一方面這種共享提供了一種有效的數(shù)據(jù)交互方式(如:共享內(nèi)存),另一方面,堆中的共享常量和緩存可以被所有棧訪問,節(jié)省了空間。
  第三,棧因?yàn)檫\(yùn)行時的需要,比如保存系統(tǒng)運(yùn)行的上下文,需要進(jìn)行地址段的劃分。由于棧只能向上增長,因此就會限制住棧存儲內(nèi)容的能力。而堆不同,堆中的對象是可以根據(jù)需要動態(tài)增長的,因此棧和堆的拆分,使得動態(tài)增長成為可能,相應(yīng)棧中只需記錄堆中的一個地址即可。
  第四,面向?qū)ο缶褪嵌押蜅5耐昝澜Y(jié)合。其實(shí),面向?qū)ο蠓绞降某绦蚺c以前結(jié)構(gòu)化的程序在執(zhí)行上沒有任何 區(qū)別。但是,面向?qū)ο蟮囊?,使得對待問題的思考方式發(fā)生了改變,而更接近于自然方式的思考。當(dāng)我們把對象拆開,你會發(fā)現(xiàn),對象的屬性其實(shí)就是數(shù)據(jù),存放 在堆中;而對象的行為(方法),就是運(yùn)行邏輯,放在棧中。我們在編寫對象的時候,其實(shí)即編寫了數(shù)據(jù)結(jié)構(gòu),也編寫的處理數(shù)據(jù)的邏輯。
  3,棧中存放什么?堆中存放什么?
  堆中存的是對象。棧中存的是基本數(shù)據(jù)類型和堆中對象的引用。一個對象的大小是不可估計的,或者說是可以動態(tài)變化的,但是在棧中,一個對象只對應(yīng)了一個4btye的引用(堆棧分離的好處)。基本數(shù)據(jù)類型占用的空間一般是1~8個字節(jié)——需要空間比較少,而且因?yàn)槭腔绢愋?,所以不會出現(xiàn)動態(tài)增長的情況——長度固定,因此棧中存儲就夠了,如果把他存在堆中是沒有什么意義的。可以這么說,基本類型和對象的引用都是存放在棧中,而且都是幾個字節(jié)的一個數(shù),因此在程序運(yùn)行時,他們的處理方式是統(tǒng)一的。但是基本類型、對象引用和對象本身就有所區(qū)別了,因?yàn)榛绢愋?、對象引用是棧中的?shù)據(jù),對象本身是堆中的數(shù)據(jù)。最常見的一 個問題就是,Java中參數(shù)傳遞時的問題。
  4,Java中的參數(shù)傳遞時傳值呢?還是傳引用?
  要說明這個問題,先要明確兩點(diǎn):
  1. 不要試圖與C進(jìn)行類比,Java中沒有指針的概念
  2. 程序運(yùn)行永遠(yuǎn)都是在棧中進(jìn)行的,因而參數(shù)傳遞時,只存在傳遞基本類型和對象引用的問題。不會直接傳對象本身。
  明確以上兩點(diǎn)后。Java在方法調(diào)用傳遞參數(shù)時,因?yàn)闆]有指針,所以它都是進(jìn)行傳值調(diào)用(這點(diǎn)可以參考C的傳值調(diào)用)。因此,很多書里面都說Java是進(jìn)行傳值調(diào)用,這點(diǎn)沒有問題,而且也簡化的C中復(fù)雜性。
  在運(yùn)行棧中,基本類型和引用的處理是一樣的,都是傳值,所以,如果是傳引用的方法調(diào)用,也同時可以理解為“傳遞引用的值”的傳值調(diào)用,即引用的處理跟基本類型是完全一樣的。但是當(dāng)進(jìn)入被調(diào)用方法時,被傳遞的這個引用的值,被程序解釋(或者查找)到堆中的對象,這個時候才對應(yīng)到真正的對象。如果此時進(jìn)行修改,修改的是引用對應(yīng)的對象,而不是引用本身,即:修改的是堆中的數(shù)據(jù)。所以這個修改是可以保持的了。
  堆和棧中,棧是程序運(yùn)行最根本的東西。程序運(yùn)行可以沒有堆,但是不能沒有棧。而堆是為棧進(jìn)行數(shù)據(jù)存儲服務(wù),說白了堆就是一塊共享的內(nèi)存。不過,正是因?yàn)槎押蜅5姆蛛x的思想,才使得Java的垃圾回收成為可能。
Java中,棧的大小通過-Xss來設(shè)置,當(dāng)棧中存儲數(shù)據(jù)比較多時,需要適當(dāng)調(diào)大這個值,否則會出現(xiàn)java.lang.StackOverflowError異常。常見的出現(xiàn)這個異常的是無法返回的遞歸,因?yàn)榇藭r棧中保存的信息都是方法返回的記錄點(diǎn)。
以上就是小編的理解。
 

免責(zé)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),也不承認(rèn)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,請發(fā)送郵件至:operations@xinnet.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

免費(fèi)咨詢獲取折扣

Loading
日韩交啪啪网站| 四虎影院精品免费| av校园激情小说| 国产四区| 自拍偷拍欧美日韩区| 亚洲免费高潮| 亚洲 都市 校园 激情 另类| 精品男人天堂| 熟女九区| 天堂AV午夜| 亚洲激情 欧美激情| 白浆爆| 肏屄乱伦对白Av| 777久久久免费精品国产| 色吧av色av| 国产av天堂无码一区二区三区| 国产成人亚洲综合色影视| 天天想夜夜做日日爽| 91av无码在线| 色欲迷情一区二区三区| 国产 五十路| 国产中文字幕一二区| 97日韩在线| 国产精品精品自在线拍| 欧美激情综合亚洲一二区| AV天堂午夜精品一区二区三区| 欧美成人在线123| 黑人粗大区一区二视频| 中文字幕二区av| 天天干夜干夜| 亚洲爱网站| 亚洲热精品| 国产在线观看无码免费视频| a黄色网站| 日韩成人一区| 久久侵犯人妻中文字幕| 久久久亚洲伊人| 国产婷婷色一区二区三区| 2020久久精品视频| 不卡无码不卡| 久久国产欧美日韩精品图片|