JVM的內(nèi)存分配方式是什么?這個(gè)問(wèn)題可能是我們?nèi)粘W(xué)習(xí)或工作經(jīng)常見(jiàn)到的。希望通過(guò)這個(gè)問(wèn)題能讓你收獲頗深。下面是小編給大家?guī)?lái)的參考內(nèi)容,讓我們一起來(lái)看看吧!
成都創(chuàng)新互聯(lián)專注于黑河網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供黑河營(yíng)銷型網(wǎng)站建設(shè),黑河網(wǎng)站制作、黑河網(wǎng)頁(yè)設(shè)計(jì)、黑河網(wǎng)站官網(wǎng)定制、成都微信小程序服務(wù),打造黑河網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供黑河網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
java虛擬機(jī)編譯時(shí)的內(nèi)存存儲(chǔ)有三類:
1、靜態(tài)(方法區(qū))存儲(chǔ)
2、棧式存儲(chǔ)
3、堆式存儲(chǔ)
靜態(tài)存儲(chǔ)是指在編譯的時(shí)候就得確定這個(gè)數(shù)據(jù)的存儲(chǔ)需求,然后給它分配固定的內(nèi)存,所以說(shuō)靜態(tài)存儲(chǔ)不允許有可變的數(shù)據(jù)結(jié)構(gòu)出現(xiàn),因?yàn)榭勺兊臄?shù)據(jù)不會(huì)確定存儲(chǔ)空間
棧式存儲(chǔ)相比于靜態(tài)存儲(chǔ)正好相反,在編譯時(shí),棧式存儲(chǔ)指定的存儲(chǔ)數(shù)據(jù)是不確定的,只有真正運(yùn)行到這個(gè)數(shù)據(jù)的時(shí)候才知道,那時(shí)候才能為它分配內(nèi)存空間
堆式存儲(chǔ)相對(duì)于棧式存儲(chǔ),棧式存儲(chǔ)在分配空間前必須指定數(shù)據(jù)要分配多少內(nèi)存,而堆式存儲(chǔ)則完全無(wú)法確定數(shù)據(jù)結(jié)構(gòu)需要的內(nèi)存空間,比如可變數(shù)組,對(duì)象實(shí)例,所以堆是由大片的可利用塊和空閑塊組成
靜態(tài)存儲(chǔ)相對(duì)簡(jiǎn)單,所以我們著重分析棧和堆的關(guān)系和區(qū)別
區(qū)別:
在棧中的數(shù)據(jù)一旦超過(guò)它的作用域之后,就會(huì)被釋放,內(nèi)存會(huì)被其他數(shù)據(jù)占用
在堆中,分配的內(nèi)存是由java虛擬機(jī)自動(dòng)垃圾回收器管理,這些可變數(shù)組、對(duì)象在沒(méi)有引用變量指向他們的時(shí)候,才會(huì)變成垃圾,但仍然占著內(nèi)存,之后再一個(gè)不確定的時(shí)間被垃圾回收器釋放掉
在一個(gè)JVM實(shí)例中,堆區(qū)只有一個(gè),而棧可以有多個(gè)
關(guān)系
在堆中創(chuàng)建一個(gè)數(shù)據(jù)之后,可以在棧中定義一個(gè)變量,這個(gè)變量指向堆中的某個(gè)數(shù)據(jù)(指向數(shù)據(jù)的首地址),也就是說(shuō)這個(gè)變量變成了堆中數(shù)據(jù)的引用變量,可以利用引用變量來(lái)訪問(wèn)堆中的數(shù)據(jù),這就是java的指針。
并且每個(gè)java應(yīng)有都會(huì)有一個(gè)JVM實(shí)例,每個(gè)實(shí)例對(duì)應(yīng)一個(gè)堆,在這個(gè)應(yīng)有運(yùn)行期間,所有的類實(shí)例和數(shù)組都放在這個(gè)堆中,在建立一個(gè)對(duì)象的時(shí)候會(huì)從兩個(gè)地方分配內(nèi)存,在堆中是這個(gè)對(duì)象的實(shí)際值,而在棧(堆棧,也叫stack)中,分配的是堆中這個(gè)對(duì)象的索引
先看下這張圖(嗯 畫(huà)的很形象)
JVM是基于堆棧的,每新建一個(gè)線程會(huì)分配一個(gè)堆棧,它是以幀為單位,有先進(jìn)后出的特性(看圖可懂)
當(dāng)激活一個(gè)java方法時(shí),就為往堆棧中放入一個(gè)幀(這就是壓棧),在這個(gè)方法的執(zhí)行過(guò)程中,這個(gè)幀就會(huì)用來(lái)保存數(shù)據(jù)
方法的存在有堆棧決定,而由于先進(jìn)后出的形式,方法之間嵌套的越深,stack的內(nèi)存就越難釋放,所以遞歸這樣的方法本人不推薦使用
下面貼出壓棧和出棧的具體實(shí)現(xiàn)
使用壓棧出棧來(lái)將字符串倒序
String value = "test 1234567890"; StringBuffer result = new StringBuffer(); Stack stack = new Stack(); for(char c : value.toCharArray()) { stack.push(c); } while (!stack.empty()) { result.append(stack.pop()); } value = result.toString();
感謝各位的閱讀!看完上述內(nèi)容,你們對(duì)JVM的內(nèi)存分配方式是什么大概了解了嗎?希望文章內(nèi)容對(duì)大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
分享名稱:JVM的內(nèi)存分配方式是什么
文章鏈接:http://www.2m8n56k.cn/article40/gsegho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開(kāi)發(fā)、網(wǎng)站內(nèi)鏈、搜索引擎優(yōu)化、網(wǎng)站設(shè)計(jì)、Google、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)