成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

JVM的內(nèi)存分配方式

habren / 2315人閱讀

摘要:前言本篇講解在程序運(yùn)行時(shí),內(nèi)存的分配是怎樣進(jìn)行的虛擬機(jī)編譯時(shí)的內(nèi)存存儲(chǔ)有三類(lèi)靜態(tài)方法區(qū)存儲(chǔ)棧式存儲(chǔ)堆式存儲(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ù)不

前言

本篇講解在java程序運(yùn)行時(shí),內(nèi)存的分配是怎樣進(jìn)行的?

java虛擬機(jī)編譯時(shí)的內(nèi)存存儲(chǔ)有三類(lèi):
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)訪(fǎng)問(wèn)堆中的數(shù)據(jù),這就是java的指針。

并且每個(gè)java應(yīng)有都會(huì)有一個(gè)JVM實(shí)例,每個(gè)實(shí)例對(duì)應(yīng)一個(gè)堆,在這個(gè)應(yīng)有運(yùn)行期間,所有的類(lèi)實(shí)例和數(shù)組都放在這個(gè)堆中,在建立一個(gè)對(duì)象的時(shí)候會(huì)從兩個(gè)地方分配內(nèi)存,在堆中是這個(gè)對(duì)象的實(shí)際值,而在棧(堆棧,也叫stack)中,分配的是堆中這個(gè)對(duì)象的索引

堆棧(stack)

先看下這張圖(嗯 畫(huà)的很形象)

JVM是基于堆棧的,每新建一個(gè)線(xiàn)程會(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();

以上便是JVM的內(nèi)存分配方式
覺(jué)得還可以的請(qǐng)點(diǎn)個(gè)贊,贊不了也可以收藏下;
總之,謝謝閱讀~

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/68060.html

相關(guān)文章

  • 萬(wàn)萬(wàn)沒(méi)想到,JVM內(nèi)存結(jié)構(gòu)面試題可以問(wèn)這么難?

    摘要:方法區(qū)在實(shí)際內(nèi)存空間站可以是不連續(xù)的。這一規(guī)定,可以說(shuō)是給了虛擬機(jī)廠商很大的自由。但是值得注意的是,堆其實(shí)還未每一個(gè)線(xiàn)程單獨(dú)分配了一塊空間,這部分空間在分配時(shí)是線(xiàn)程獨(dú)享的,在使用時(shí)是線(xiàn)程共享的。 在我的博客中,之前有很多文章介紹過(guò)JVM內(nèi)存結(jié)構(gòu),相信很多看多我文章的朋友對(duì)這部分知識(shí)都有一定的了解了。 那么,請(qǐng)大家嘗試著回答一下以下問(wèn)題: 1、JVM管理的內(nèi)存結(jié)構(gòu)是怎樣的? 2、不同的...

    CloudwiseAPM 評(píng)論0 收藏0
  • 淺析JVM內(nèi)存管理

    摘要:概要要理解的內(nèi)存管理策略,首先就要熟悉的運(yùn)行時(shí)數(shù)據(jù)區(qū),如上圖所示,在執(zhí)行程序的時(shí)候,虛擬機(jī)會(huì)把它所管理的內(nèi)存劃分為多個(gè)不同的數(shù)據(jù)區(qū),稱(chēng)為運(yùn)行時(shí)數(shù)據(jù)區(qū)。 這是一篇有關(guān)JVM內(nèi)存管理的文章。這里將會(huì)簡(jiǎn)單的分析一下Java如何使用從物理內(nèi)存上申請(qǐng)下來(lái)的內(nèi)存,以及如何來(lái)劃分它們,后面還會(huì)介紹JVM的核心技術(shù):如何分配和回收內(nèi)存。 JMM ( Java Memory Model )概要 show...

    Eric 評(píng)論0 收藏0
  • 十種JVM內(nèi)存溢出情況,你碰到過(guò)幾種?

    摘要:內(nèi)存溢出的情況就是從類(lèi)加載器加載的時(shí)候開(kāi)始出現(xiàn)的,內(nèi)存溢出分為兩大類(lèi)和。以下舉出個(gè)內(nèi)存溢出的情況,并通過(guò)實(shí)例代碼的方式講解了是如何出現(xiàn)內(nèi)存溢出的。內(nèi)存溢出問(wèn)題描述元空間的溢出,系統(tǒng)會(huì)拋出。這樣就會(huì)造成棧的內(nèi)存溢出。 導(dǎo)言: 對(duì)于java程序員來(lái)說(shuō),在虛擬機(jī)自動(dòng)內(nèi)存管理機(jī)制的幫助下,不需要自己實(shí)現(xiàn)釋放內(nèi)存,不容易出現(xiàn)內(nèi)存泄漏和內(nèi)存溢出的問(wèn)題,由虛擬機(jī)管理內(nèi)存這一切看起來(lái)非常美好,但是一旦...

    ShevaKuilin 評(píng)論0 收藏0
  • JVM解剖公園

    摘要:為此,引入轉(zhuǎn)換查找緩沖緩存最近的轉(zhuǎn)換記錄。這個(gè)優(yōu)化技術(shù),可以看到將原本對(duì)對(duì)象的字段訪(fǎng)問(wèn),替換為一個(gè)局部變量的訪(fǎng)問(wèn)。當(dāng)所有線(xiàn)程都在已知的位置停止的時(shí)候,被認(rèn)為是到達(dá)了安全點(diǎn)。檢查安全點(diǎn)請(qǐng)求的代碼 showImg(https://segmentfault.com/img/bVbwfcz?w=1024&h=576); 1、JVM鎖粗化和循環(huán)原文標(biāo)題:JVM Anatomy Quark #1:...

    imingyu 評(píng)論0 收藏0
  • Java對(duì)象分配簡(jiǎn)要流程

    摘要:在一般應(yīng)用中,不會(huì)逃逸的局部對(duì)象所占的比例很大,如果能使用棧上分配,那大量的對(duì)象就會(huì)隨著方法的結(jié)束而自動(dòng)銷(xiāo)毀了,垃圾收集系統(tǒng)的壓力將會(huì)小很多。相關(guān)參數(shù)設(shè)置大對(duì)象直接進(jìn)入年老代的閾值,當(dāng)對(duì)象大小超過(guò)這個(gè)值時(shí),將直接在年老代分配。 jvm系列 垃圾回收基礎(chǔ) JVM的編譯策略 GC的三大基礎(chǔ)算法 GC的三大高級(jí)算法 GC策略的評(píng)價(jià)指標(biāo) JVM信息查看 GC通用日志解讀 jvm的card t...

    zorro 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<