国产日韩精品视频_2020久久国产最新免费观看_国内久久久久影院精品_日本一区二区视频在线

我愛(ài)學(xué)習(xí)網(wǎng)-上傳
當(dāng)前位置: 主頁(yè) > 文庫(kù) > Java >

Java 堆和棧的概念,看這篇就夠

時(shí)間:2020-08-02 10:01來(lái)源:我愛(ài)學(xué)習(xí)網(wǎng) 作者:apple 點(diǎn)擊:

堆和棧的概念可以說(shuō)是 Java 開(kāi)發(fā)底層的一大問(wèn)題了。今天和一個(gè)復(fù)旦的哥們?cè)谟懻摶緮?shù)據(jù)類(lèi)型在堆棧中的存儲(chǔ)問(wèn)題,以及明白了這個(gè)問(wèn)題對(duì)于用戶(hù)(程序員)來(lái)說(shuō)有何意義。

 

順便總結(jié)一下堆棧相關(guān)的知識(shí)。google 了很多,學(xué)習(xí)了很多,學(xué)習(xí) Java 堆棧知識(shí),看這篇就夠了!

 

  • 功能不同
  • 棧內(nèi)存用來(lái)存儲(chǔ)局部變量和方法調(diào)用。
  • 而堆內(nèi)存用來(lái)存儲(chǔ) Java 中的對(duì)象。無(wú)論是成員變量,局部變量,還是類(lèi)變量,它們指向的對(duì)象都存儲(chǔ)在堆內(nèi)存中。
  • 共享性不同
  • 棧內(nèi)存是線(xiàn)程私有的。
  • 堆內(nèi)存是所有線(xiàn)程共有的。
  • 異常錯(cuò)誤不同
    如果棧內(nèi)存或者堆內(nèi)存不足都會(huì)拋出異常。
  • 棧空間不足:java.lang.StackOverFlowError。
  • 堆空間不足:java.lang.OutOfMemoryError。
  • 空間大小
    棧的空間大小遠(yuǎn)遠(yuǎn)小于堆的。

 

棧幀由三部分組成:局部變量區(qū)、操作數(shù)棧、幀數(shù)據(jù)區(qū)。局部變量區(qū)和操作數(shù)棧的大小要視對(duì)應(yīng)的方法而定,他們是按字長(zhǎng)計(jì)算的。但調(diào)用一個(gè)方法時(shí),它從類(lèi)型信息中得到此方法局部變量區(qū)和操作數(shù)棧大小,并據(jù)此分配棧內(nèi)存,然后壓入 Java 棧。

 

  • 局部變量區(qū)
    局部變量區(qū)被組織為以一個(gè)字長(zhǎng)為單位、從 0 開(kāi)始計(jì)數(shù)的數(shù)組,類(lèi)型為 short、byte 和 char 的值在存入數(shù)組前要被轉(zhuǎn)換成 int 值,而 long 和 double 在數(shù)組中占據(jù)連續(xù)的兩項(xiàng),在訪(fǎng)問(wèn)局部變量中的 long 或 double 時(shí),只需取出連續(xù)兩項(xiàng)的第一項(xiàng)的索引值即可, 如某個(gè) long 值在局部變量區(qū)中占據(jù)的索引時(shí) 3、4 項(xiàng),取值時(shí),指令只需取索引為 3 的 long 值即可。
    如下代碼以及圖所示:
    public static int runClassMethod(int i,long l,float f,double d,Object o,byte b) { 
       return 0;   
    }
    
    public int runInstanceMethod(char c,double d,short s,boolean b) { 
           return 0;   
    }

  • 操作數(shù)棧
    和局部變量區(qū)一樣,操作數(shù)棧也被組織成一個(gè)以字長(zhǎng)為單位的數(shù)組。但和前者不同的是,它不是通過(guò)索引來(lái)訪(fǎng)問(wèn)的,而是通過(guò)入棧和出棧來(lái)訪(fǎng)問(wèn)的。可把操作數(shù)棧理解為存儲(chǔ)計(jì)算時(shí),臨時(shí)數(shù)據(jù)的存儲(chǔ)區(qū)域。下面我們通過(guò)一段簡(jiǎn)短的程序片段外加一幅圖片來(lái)了解下操作數(shù)棧的作用。

 

int a = 1;
	int b = 98;
	int c = a+b;

 

 

從圖中可以得出:操作數(shù)棧其實(shí)就是個(gè)臨時(shí)數(shù)據(jù)存儲(chǔ)區(qū)域,它是通過(guò)入棧和出棧來(lái)進(jìn)行操作的。

 

  • 幀數(shù)據(jù)區(qū)
    除了局部變量區(qū)和操作數(shù)棧外,java 棧幀還需要一些數(shù)據(jù)來(lái)支持常量池解析、正常方法返回以及異常派發(fā)機(jī)制。這些數(shù)據(jù)都保存在 java 棧幀的幀數(shù)據(jù)區(qū)中。
    當(dāng) JVM 執(zhí)行到需要常量池?cái)?shù)據(jù)的指令時(shí),它都會(huì)通過(guò)幀數(shù)據(jù)區(qū)中指向常量池的指針來(lái)訪(fǎng)問(wèn)它。
    除了處理常量池解析外,幀里的數(shù)據(jù)還要處理 java 方法的正常結(jié)束和異常終止。如果是通過(guò) return 正常結(jié)束,則當(dāng)前棧幀從 Java 棧中彈出,恢復(fù)發(fā)起調(diào)用的方法的棧。如果方法又返回值,JVM 會(huì)把返回值壓入到發(fā)起調(diào)用方法的操作數(shù)棧。
    為了處理 java 方法中的異常情況,幀數(shù)據(jù)區(qū)還必須保存一個(gè)對(duì)此方法異常引用表的引用。當(dāng)異常拋出時(shí),JVM 給 catch 塊中的代碼。如果沒(méi)發(fā)現(xiàn),方法立即終止,然后 JVM 用幀區(qū)數(shù)據(jù)的信息恢復(fù)發(fā)起調(diào)用的方法的幀。然后再發(fā)起調(diào)用方法的上下文重新拋出同樣的異常。
  • 棧的整個(gè)結(jié)構(gòu)
    在前面就描述過(guò):棧是由棧幀組成,每當(dāng)線(xiàn)程調(diào)用一個(gè) java 方法時(shí),JVM 就會(huì)在該線(xiàn)程對(duì)應(yīng)的棧中壓入一個(gè)幀,而幀是由局部變量區(qū)、操作數(shù)棧和幀數(shù)據(jù)區(qū)組成。那在一個(gè)代碼塊中,棧到底是什么形式呢?下面是我從《深入 JVM》中摘抄的一個(gè)例子,大家可以看看:
    public class Main{    
    	public static void addAndPrint(){      
        	double result = addTwoTypes(1,88.88);    
            System.out.println(result);    
        }   
             
        public static double addTwoTypes(int i,double d){  
        	return i + d;  
        }
    }

    執(zhí)行過(guò)程中的三個(gè)快照:

    上面所給的圖,只想說(shuō)明兩件事情:
  1. 只有在調(diào)用一個(gè)方法時(shí),才為當(dāng)前棧分配一個(gè)幀,然后將該幀壓入棧
  1. 幀中存儲(chǔ)了對(duì)應(yīng)方法的局部數(shù)據(jù),方法執(zhí)行完,對(duì)應(yīng)的幀則從棧中彈出,并把返回結(jié)果存儲(chǔ)在調(diào)用 方法的幀的操作數(shù)棧中

 

一、Java 中的基本數(shù)據(jù)類(lèi)型一定存儲(chǔ)在棧中嗎?

 

不一定。棧內(nèi)存用來(lái)存儲(chǔ)局部變量和方法調(diào)用。

 

如果該局部變量是基本數(shù)據(jù)類(lèi)型例如

 

那么直接將該值存儲(chǔ)在棧中。

 

如果該局部變量是一個(gè)對(duì)象如

 

int[] array=new int[]{1,2};

 

那么將引用存在棧中而對(duì)象 ({1,2}) 存儲(chǔ)在堆內(nèi)。

 

二、棧的速度比堆快嗎?

 

參考《Pro .NET Performance》可知:

 

Contrary to popular belief, there isn’t that much of a difference between stacks and heaps in a .NET process. Stacks and heaps are nothing more than ranges of addresses in virtual memory, and there is no inherent advantage in the range of addresses reserved to the stack of a particular thread compared to the range of addresses reserved for the managed heap. Accessing a memory location on the heap is neither faster nor slower than accessing a memory location on the stack. There are several considerations that might, in certain cases, support the claim that memory access to stack locations is faster, overall, than memory access to heap locations. Among them:

  • On the stack, temporal allocation locality (allocations made close together in time) implies spatial locality (storage that is close together in space). In turn, when temporal allocation locality implies temporal access locality (objects allocated together are accessed together), the sequential stack storage tends to perform better with respect to CPU caches and operating system paging systems.
  • Memory density on the stack tends to be higher than on the heap because of the reference type overhead (discussed later in this chapter). Higher memory density often leads to better performance, e.g., because more objects fit in the CPU cache.
  • Thread stacks tend to be fairly small – the default maximum stack size on Windows is 1MB, and most threads tend to actually use only a few stack pages. On modern systems, the stacks of all application threads can fit into the CPU cache, making typical stack object access extremely fast. (Entire heaps, on the other hand, rarely fit into CPU caches.)

With that said, you should not be moving all your allocations to the stack! Thread stacks on Windows are limited, and it is easy to exhaust the stack by applying injudicious recursion and large stack allocations.

 

即一定情況下棧的速度是比堆快的,但是快的并不明顯。畢竟都是 RAM。所以這算不上堆和棧的一大區(qū)別。

 

回到最初,我和復(fù)旦哥們的討論。基本類(lèi)型數(shù)據(jù)如果是局部變量并且非對(duì)象那么 JVM 中是把值直接存入棧中的而不是存儲(chǔ)一個(gè)引用對(duì)象然后借由這個(gè)對(duì)象來(lái)找到值。這其實(shí)算的上是實(shí)際運(yùn)行時(shí) JVM 提供的性能優(yōu)化。因此基本數(shù)據(jù)類(lèi)型和引用類(lèi)型在棧中的存儲(chǔ)情況就是不一樣的了。

 

但是這些不一樣,對(duì)于用戶(hù)(程序員)來(lái)說(shuō)是透明的。所以如果僅僅從語(yǔ)義的角度把基本類(lèi)型看成引用類(lèi)型,雖然不夠嚴(yán)謹(jǐn),但是對(duì)于使用者(程序員)來(lái)說(shuō)有利于理解和學(xué)習(xí)。

 

------分隔線(xiàn)----------------------------
    ?分享到??
看看啦
国产日韩精品视频_2020久久国产最新免费观看_国内久久久久影院精品_日本一区二区视频在线

9000px;">

国产精品一区久久久久| 免费一级欧美片在线观看| 久久久精品人体av艺术| 一区二区三区在线不卡| 精品sm在线观看| 韩国视频一区二区| 日韩一二三区视频| 日韩成人伦理电影在线观看| 欧美午夜精品一区二区蜜桃| 亚洲福利视频一区二区| 欧美视频一区二区三区在线观看| 国产精品欧美一级免费| jlzzjlzz国产精品久久| 日本午夜精品视频在线观看 | 91一区二区在线观看| 亚洲乱码国产乱码精品精可以看| 99久久精品国产导航| 伊人婷婷欧美激情| 欧美高清视频在线高清观看mv色露露十八| 三级精品在线观看| 精品美女在线观看| 不卡av免费在线观看| 亚洲欧美区自拍先锋| 在线观看视频欧美| 国产成人在线影院 | 丰满亚洲少妇av| 午夜精品福利一区二区三区蜜桃| 欧美一级xxx| 国产成人鲁色资源国产91色综| 国产色婷婷亚洲99精品小说| 欧美性受xxxx黑人xyx性爽| 奇米在线7777在线精品| 国产精品色在线| 欧美三级午夜理伦三级中视频| 国产不卡视频一区二区三区| 夜夜嗨av一区二区三区网页| 欧美不卡一区二区三区四区| 欧美日韩黄色一区二区| 成人国产精品免费观看| 亚洲成人av免费| 国产欧美视频一区二区三区| 欧美日韩精品福利| 国产成人av电影在线播放| 亚洲一区二区偷拍精品| 亚洲视频每日更新| 日韩欧美第一区| 在线视频你懂得一区| 国产精品一品视频| 国产精品一二三| 日韩专区中文字幕一区二区| 中文字幕精品一区二区三区精品 | 91蝌蚪porny| 久88久久88久久久| 久久精品72免费观看| 亚洲综合免费观看高清完整版 | 奇米亚洲午夜久久精品| 国产精品美女久久久久av爽李琼| 日韩一级精品视频在线观看| 欧美亚一区二区| 欧美巨大另类极品videosbest | 轻轻草成人在线| 亚洲综合色视频| 亚洲伦理在线精品| 91麻豆精品国产| 欧美一级高清片| 91麻豆精品国产91久久久久久| 在线视频综合导航| 精久久久久久久久久久| 成人激情免费电影网址| 国产综合一区二区| 久久国产免费看| 久久99国产精品麻豆| 国产成人精品网址| 国产**成人网毛片九色 | 国产一区二区三区在线观看免费 | 欧美欧美欧美欧美| 色激情天天射综合网| 99精品久久只有精品| 99天天综合性| 在线观看亚洲精品视频| 精品美女一区二区| 2023国产精品自拍| 久久午夜免费电影| 日本一区二区三区在线观看| 一区二区三区中文字幕在线观看| 亚洲另类在线视频| 午夜欧美2019年伦理| 美女视频黄频大全不卡视频在线播放| 久久国产福利国产秒拍| 美国三级日本三级久久99| 裸体一区二区三区| 成人综合婷婷国产精品久久免费| 国产91丝袜在线播放0| 极品瑜伽女神91| 色综合一区二区三区| 欧美系列日韩一区| 久久这里只精品最新地址| 最近中文字幕一区二区三区| 日本欧美一区二区三区乱码| 99精品视频一区| 久久久国产精品不卡| 同产精品九九九| 菠萝蜜视频在线观看一区| 91精品国产综合久久婷婷香蕉| 欧美国产精品一区| 蜜臀av性久久久久蜜臀aⅴ四虎| 91视频一区二区三区| 欧美激情在线观看视频免费| 免费视频最近日韩| 欧美丝袜丝交足nylons| 国产精品国产馆在线真实露脸 | 日韩久久一区二区| 国产一区二区三区免费播放| 欧美日韩一区二区在线观看| 国产精品久久久久久久浪潮网站| 国产精品一区二区在线播放| 精品久久久久久久一区二区蜜臀| 香蕉成人啪国产精品视频综合网| 972aa.com艺术欧美| 国产日产欧美一区| 国产91色综合久久免费分享| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 欧美美女视频在线观看| 国产精品妹子av| 国内精品免费在线观看| 日韩精品在线一区二区| 日本美女一区二区| 日韩写真欧美这视频| 日本欧美一区二区三区| 欧美成人国产一区二区| 国产专区综合网| 国产日韩v精品一区二区| 懂色av噜噜一区二区三区av| 中国色在线观看另类| 99精品黄色片免费大全| 亚洲综合999| 91精品在线一区二区| 久久电影网站中文字幕 | 美女www一区二区| 精品国产一区二区三区四区四| 国内精品第一页| 国产欧美日韩在线观看| 99久精品国产| 午夜精品123| 精品久久人人做人人爱| 成人97人人超碰人人99| 亚洲一区在线看| 91精品国产色综合久久| 国产高清精品网站| 亚洲人成7777| 欧美一区二区性放荡片| 成人性视频免费网站| 亚洲国产综合91精品麻豆| 337p粉嫩大胆色噜噜噜噜亚洲| 成人福利视频网站| 午夜激情一区二区| 中文字幕的久久| 欧美久久久久久蜜桃| 成人免费视频网站在线观看| 亚洲精品亚洲人成人网在线播放| 欧美群妇大交群中文字幕| 成人免费看的视频| 日韩二区在线观看| 国产三级三级三级精品8ⅰ区| 一本到不卡免费一区二区| 久久精品理论片| 亚洲在线中文字幕| 欧美激情在线一区二区| 制服丝袜在线91| 色呦呦国产精品| 国产精品资源网| 蜜桃久久久久久| 亚洲成人动漫一区| 亚洲视频中文字幕| 日本一二三四高清不卡| 精品久久人人做人人爰| 在线播放日韩导航| 欧美午夜电影在线播放| 成人av资源在线观看| 韩国v欧美v亚洲v日本v| 五月婷婷久久丁香| 一区二区三区欧美日| 国产精品人人做人人爽人人添| 欧美一级片在线看| 在线播放视频一区| 欧美日韩精品高清| 欧美日韩精品专区| 欧美亚洲自拍偷拍| 欧美在线免费视屏| 91麻豆高清视频| 色婷婷综合久久久久中文| 成人av影视在线观看| 成人午夜又粗又硬又大| 粉嫩一区二区三区在线看| 国产精品影视在线| 国产精品18久久久久久久久久久久 | 大白屁股一区二区视频| 粉嫩高潮美女一区二区三区| 国产精品一区不卡| 国产91清纯白嫩初高中在线观看|