亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

habren / 2381人閱讀

摘要:前言本篇講解在程序運(yùn)行時(shí),內(nèi)存的分配是怎樣進(jìn)行的虛擬機(jī)編譯時(shí)的內(nèi)存存儲有三類靜態(tài)方法區(qū)存儲棧式存儲堆式存儲靜態(tài)存儲是指在編譯的時(shí)候就得確定這個(gè)數(shù)據(jù)的存儲需求,然后給它分配固定的內(nèi)存,所以說靜態(tài)存儲不允許有可變的數(shù)據(jù)結(jié)構(gòu)出現(xiàn),因?yàn)榭勺兊臄?shù)據(jù)不

前言

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

java虛擬機(jī)編譯時(shí)的內(nèi)存存儲有三類:
1.靜態(tài)(方法區(qū))存儲
2.棧式存儲
3.堆式存儲

靜態(tài)存儲是指在編譯的時(shí)候就得確定這個(gè)數(shù)據(jù)的存儲需求,然后給它分配固定的內(nèi)存,所以說靜態(tài)存儲不允許有可變的數(shù)據(jù)結(jié)構(gòu)出現(xiàn),因?yàn)榭勺兊臄?shù)據(jù)不會確定存儲空間

棧式存儲相比于靜態(tài)存儲正好相反,在編譯時(shí),棧式存儲指定的存儲數(shù)據(jù)是不確定的,只有真正運(yùn)行到這個(gè)數(shù)據(jù)的時(shí)候才知道,那時(shí)候才能為它分配內(nèi)存空間

堆式存儲相對于棧式存儲,棧式存儲在分配空間前必須指定數(shù)據(jù)要分配多少內(nèi)存,而堆式存儲則完全無法確定數(shù)據(jù)結(jié)構(gòu)需要的內(nèi)存空間,比如可變數(shù)組,對象實(shí)例,所以堆是由大片的可利用塊和空閑塊組成

棧和堆

靜態(tài)存儲相對簡單,所以我們著重分析棧和堆的關(guān)系和區(qū)別

區(qū)別
在棧中的數(shù)據(jù)一旦超過它的作用域之后,就會被釋放,內(nèi)存會被其他數(shù)據(jù)占用
在堆中,分配的內(nèi)存是由java虛擬機(jī)自動垃圾回收器管理,這些可變數(shù)組、對象在沒有引用變量指向他們的時(shí)候,才會變成垃圾,但仍然占著內(nèi)存,之后再一個(gè)不確定的時(shí)間被垃圾回收器釋放掉

在一個(gè)JVM實(shí)例中,堆區(qū)只有一個(gè),而??梢杂卸鄠€(gè)

關(guān)系
在堆中創(chuàng)建一個(gè)數(shù)據(jù)之后,可以在棧中定義一個(gè)變量,這個(gè)變量指向堆中的某個(gè)數(shù)據(jù)(指向數(shù)據(jù)的首地址),也就是說這個(gè)變量變成了堆中數(shù)據(jù)的引用變量,可以利用引用變量來訪問堆中的數(shù)據(jù),這就是java的指針。

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

堆棧(stack)

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

JVM是基于堆棧的,每新建一個(gè)線程會分配一個(gè)堆棧,它是以幀為單位,有先進(jìn)后出的特性(看圖可懂)
當(dāng)激活一個(gè)java方法時(shí),就為往堆棧中放入一個(gè)幀(這就是壓棧),在這個(gè)方法的執(zhí)行過程中,這個(gè)幀就會用來保存數(shù)據(jù)

方法的存在有堆棧決定,而由于先進(jìn)后出的形式,方法之間嵌套的越深,stack的內(nèi)存就越難釋放,所以遞歸這樣的方法本人不推薦使用

下面貼出壓棧和出棧的具體實(shí)現(xiàn)
使用壓棧出棧來將字符串倒序

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)存分配方式
覺得還可以的請點(diǎn)個(gè)贊,贊不了也可以收藏下;
總之,謝謝閱讀~

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

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/68060.html

相關(guān)文章

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

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

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

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

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

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

    ShevaKuilin 評論0 收藏0
  • JVM解剖公園

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

    imingyu 評論0 收藏0
  • Java對象分配簡要流程

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

    zorro 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<