摘要:的的內(nèi)存可分為個區(qū)堆棧和方法區(qū)堆區(qū)存儲的是出來的對象和數(shù)組,每個對象都包含一個與之對應(yīng)的的信息。每個棧中的數(shù)據(jù)原始類型和對象引用都是私有的,其他棧不能訪問。
JAVA的JVM的內(nèi)存可分為3個區(qū):堆(heap)、棧(stack)和方法區(qū)(method)
堆區(qū):1.存儲的是new出來的對象和數(shù)組,每個對象都包含一個與之對應(yīng)的class的信息。(class的目的是得到操作指令)
2.jvm只有一個堆區(qū)(heap)被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身
棧區(qū):1.每個線程包含一個棧區(qū),棧中保存的是所有的變量,包括基本類型和引用類型,棧中的每個變量都包含類型、名稱、值這些內(nèi)容,只不過基本類型變量的值為一個具體的值,而引用類型的變量的值為對象在堆中的地址。
2.每個棧中的數(shù)據(jù)(原始類型和對象引用)都是私有的,其他棧不能訪問。
3.棧分為3個部分:基本類型變量區(qū)、執(zhí)行環(huán)境上下文、操作指令區(qū)(存放操作指令)。
方法區(qū):1.又叫靜態(tài)區(qū),跟堆一樣,被所有的線程共享。方法區(qū)包含所有的class和static變量。
2.方法區(qū)中包含的都是在整個程序中永遠(yuǎn)唯一的元素,如class,static變量。
3.字符串常量池就是存放在方法區(qū)。
堆和棧的不同:<1>存數(shù)數(shù)據(jù)不同
<2>回收方式不同
棧中當(dāng)超過變量的作用域后,java會自動釋放掉為該變量分配的內(nèi)存空間,該內(nèi)存空間可以立刻被另作他用。數(shù)組和對象在沒有引用變量指向它的時候,才變成垃圾,不能再被使用,但是仍然占著內(nèi)存,在隨后的一個不確定的時間被垃圾回收器釋放掉。
<3>速度不同
堆中分配的內(nèi)存,由Java虛擬機的自動垃圾回收器來管理。 堆和棧的優(yōu)缺點:<1>堆的優(yōu)勢是可以動態(tài)地分配內(nèi)存大小,生存期也不必事先告訴編譯器,因為它是在運行時動態(tài)分配內(nèi)存的,Java的垃圾收集器會自動收走這些不再使用的數(shù)據(jù)。但缺點是,由于要在運行時動態(tài)分配內(nèi)存,存取速度較慢.
<2>棧的優(yōu)勢是,存取速度比堆要快,僅次于寄存器,棧數(shù)據(jù)可以共享。但缺點是,存在棧中的數(shù)據(jù)大小與生存期必須是確定的,缺乏靈活性
編譯器先處理int a = 3;首先它會在棧中創(chuàng)建一個變量為a的引用,然后查找棧中是否有3這個值,如果沒找到,就將3存放進(jìn)來,然后將a指向3。接著處理int b = 3;在創(chuàng)建完b的引用變量后,因為在棧中已經(jīng)有3這個值,便將b直接指向3。這樣,就出現(xiàn)了a與b同時均指向3的情況。
這時,如果再令a=4;那么編譯器會重新搜索棧中是否有4值,如果沒有,則將4存放進(jìn)來,并令a指向4;如果已經(jīng)有了,則直接將a指向這個地址。
因此a值的改變不會影響到b的值。
系統(tǒng)收到了我們發(fā)出的指令,啟動了一個Java虛擬機進(jìn)程,這個進(jìn)程首先從classpath中找到AppMain.class文件,讀取這個文件中的二進(jìn)制數(shù)據(jù),然后把Appmain類的類信息存放到運行時數(shù)據(jù)區(qū)的方法區(qū)中。這一過程稱為AppMain類的加載過程。
接著,Java虛擬機定位到方法區(qū)中AppMain類的Main()方法的字節(jié)碼,開始執(zhí)行它的指令。這個main()方法的第一條語句就是:Sample test1=new Sample("測試1");就是讓java虛擬機創(chuàng)建一個Sample實例,并且呢,使引用變量test1引用這個實例。就讓我們來跟蹤一下Java虛擬機,看看它究竟是怎么來執(zhí)行這個任務(wù)的:
1、 Java虛擬機直奔方法區(qū),先找到Sample類的類型信息。結(jié)果這會兒的方法區(qū)里還沒有Sample類。于是立馬加載了Sample類,把Sample類的類型信息存放在方法區(qū)里。
2、 為一個新的Sample實例分配內(nèi)存, 這個Sample實例持有著指向方法區(qū)的Sample類的類型信息的引用。而這個引用地址,就存放了在Sample實例的數(shù)據(jù)區(qū)里。
3、 在JAVA虛擬機進(jìn)程中,每個線程都會擁有一個方法調(diào)用棧,用來跟蹤線程運行中一系列的方法調(diào)用過程,棧中的每一個元素就被稱為棧幀,每當(dāng)線程調(diào)用一個方法的時候就會向方法棧壓入一個新幀。這里的幀用來存儲方法的參數(shù)、局部變量和運算過程中的臨時數(shù)據(jù)。OK,原理講完了,就讓我們來繼續(xù)我們的跟蹤行動!位于“=”前的Test1是一個在main()方法中定義的變量,可見,它是一個局部變量,因此,它被會添加到了執(zhí)行main()方法的主線程的JAVA方法調(diào)用棧中。而“=”將把這個test1變量指向堆區(qū)中的Sample實例,也就是說,它持有指向Sample實例的引用。
接下來,JAVA虛擬機將繼續(xù)執(zhí)行后續(xù)指令,在堆區(qū)里繼續(xù)創(chuàng)建另一個Sample實例,然后依次執(zhí)行它們的printName()方法。當(dāng)JAVA虛擬機執(zhí)行test1.printName()方法時,JAVA虛擬機根據(jù)局部變量test1持有的引用,定位到堆區(qū)中的Sample實例,再根據(jù)Sample實例持有的引用,定位到方法去中Sample類的類型信息,從而獲得printName()方法的字節(jié)碼,接著執(zhí)行printName()方法包含的指令。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/76958.html
摘要:是描述方法執(zhí)行的內(nèi)存模型每個方法執(zhí)行的時候會同時創(chuàng)建一個棧幀,用于存儲局部變量表操作數(shù)棧動態(tài)連接返回地址方法出口等信息。虛擬機是使用局部變量表完成參數(shù)值到參數(shù)變量表的傳遞過程。堆內(nèi)存管理最大的一塊。 showImg(https://segmentfault.com/img/bVLqsv?w=475&h=398); 1. 虛擬機棧 VM Stack 線程私有,生命周期與線程相同。VM S...
摘要:虛擬機在執(zhí)行程序的過程中會把它所管理的內(nèi)存劃分為若干個不同的數(shù)據(jù)區(qū)域。棧幀棧幀是用于支持虛擬機進(jìn)行方法調(diào)用和方法執(zhí)行的數(shù)據(jù)結(jié)構(gòu),它是虛擬機運行時數(shù)據(jù)區(qū)中的虛擬機棧的棧元素。棧幀的概念結(jié)構(gòu)如下運行時數(shù)據(jù)區(qū)腦圖高 這里我們先說句題外話,相信大家在面試中經(jīng)常被問到介紹Java內(nèi)存模型,我在面試別人時也會經(jīng)常問這個問題。但是,往往都會令我比較尷尬,我還話音未落,面試者就會背誦一段(Java虛擬...
摘要:在之后,原來永久代的數(shù)據(jù)被分到了堆和元空間中。元空間存儲類的元信息,靜態(tài)變量和常量池等放入堆中。這樣能在一些場景中顯著提高性能,因為避免了在堆內(nèi)存和堆外內(nèi)存來回拷貝數(shù)據(jù)。 以下內(nèi)容部分轉(zhuǎn)載于: CS-Notes showImg(http://ww1.sinaimg.cn/large/005NT19Ply1g385uooqv9j30kd0slmyw.jpg); 程序計數(shù)器(Program...
摘要:程序計數(shù)器程序計數(shù)器是一塊較小的內(nèi)存空間,它的作用可以看做是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器。它的主要缺點有兩個一個是效率問題,標(biāo)記和清除過程的效率都不 Jvm 相關(guān) 類加載機制 本段參考 http://www.importnew.com/2374... 類加載概念 類加載指的是將類的.class文件中的二進(jìn)制數(shù)據(jù)讀入到內(nèi)存中,將其放在運行時數(shù)據(jù)區(qū)的方法區(qū)內(nèi),然后在堆區(qū)創(chuàng)建一個ja...
摘要:下面的截圖內(nèi)容來自從規(guī)范我們可以看到,規(guī)范要求的運行時數(shù)據(jù)區(qū)域有程序計數(shù)器虛擬機棧堆方法區(qū)本地方法棧運行時常量池這及部分。查了一下,還是沒有查到官方對于運行時數(shù)據(jù)區(qū)域的說明,但是許多博客都指出將字符串常量池移動到了堆中。 不少java程序員一提JVM運行時數(shù)據(jù)區(qū)域,就會說堆和棧,當(dāng)然也有java程序員給出方法區(qū)、虛擬機棧、本地方法棧、堆、程序計數(shù)器這個答案,但是還有人給出永久代、虛擬機...
閱讀 1028·2021-09-26 09:55
閱讀 3591·2021-09-24 10:30
閱讀 1377·2021-09-08 09:36
閱讀 2559·2021-09-07 09:58
閱讀 610·2019-08-30 15:56
閱讀 776·2019-08-29 18:32
閱讀 3631·2019-08-29 15:13
閱讀 1848·2019-08-29 13:49