最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中堆和棧的概念和區(qū)別

 更新時間:2020年06月17日 10:25:55   作者:JavaJIAMIN  
Java的堆是一個運(yùn)行時數(shù)據(jù)區(qū),類的對象從堆中分配空間。棧中主要存放一些基本數(shù)據(jù)類型的變量(byte,short,int,long,float,double,boolean,char)和對象的引用,這篇文章給大家詳細(xì)介紹java 堆和棧的概念和區(qū)別,一起看看吧

當(dāng)一個人開始學(xué)習(xí)Java或者其他編程語言的時候,會接觸到堆和棧,由于一開始沒有明確清晰的說明解釋,很多人會產(chǎn)生很多疑問,什么是堆,什么是棧,堆和棧有什么區(qū)別?更糟糕的是,Java中存在棧這樣一個后進(jìn)先出(Last In First Out)的順序的數(shù)據(jù)結(jié)構(gòu),這就是java.util.Stack。這種情況下,不免讓很多人更加費(fèi)解前面的問題。事實上,堆和棧都是內(nèi)存中的一部分,有著不同的作用,而且一個程序需要在這片區(qū)域上分配內(nèi)存。眾所周知,所有的Java程序都運(yùn)行在JVM虛擬機(jī)內(nèi)部,我們這里介紹的自然是JVM(虛擬)內(nèi)存中的堆和棧。

  1. Java的堆是一個運(yùn)行時數(shù)據(jù)區(qū),類的對象從堆中分配空間。這些對象通過new等指令建立,通過垃圾回收器來銷毀。2. 堆的優(yōu)勢是可以動態(tài)地分配內(nèi)存空間,需要多少內(nèi)存空間不必事先告訴編譯器,因為它是在運(yùn)行時動態(tài)分配的。但缺點(diǎn)是,由于需要在運(yùn)行時動態(tài)分配內(nèi)存,所以存取速度較慢。 

1. 棧中主要存放一些基本數(shù)據(jù)類型的變量(byte,short,int,long,float,double,boolean,char)和對象的引用。2. 棧的優(yōu)勢是,存取速度比堆快,棧數(shù)據(jù)可以共享。但缺點(diǎn)是,存放在棧中的數(shù)據(jù)占用多少內(nèi)存空間需要在編譯時確定下來,缺乏靈活性。

舉例說明棧數(shù)據(jù)可以共享

String 可以用以下兩種方式來創(chuàng)建:

第一種使用new來創(chuàng)建的對象,它存放在堆中。每調(diào)用一次就創(chuàng)建一個新的對象。 

第二種是先在棧中創(chuàng)建對象的引用str2,然后查找棧中有沒有存放“abc”,如果沒有,則將“abc”存放進(jìn)棧,并將str2指向“abc”,如果已經(jīng)有“abc”, 則直接將str2指向“abc”。

下面用代碼說明上面的理論:

public static void main(String[] args) {
        String str1 = new String("abc");
        String str2 = new String("abc");
        System.out.println(str1 == str2);
    }

輸出結(jié)果為:false

public static void main(String[] args) {
        String str1 = "abc";
        String str2 = "abc";
        System.out.println(str1 == str2);
    }

輸出結(jié)果為:true

因此,用第二種方式創(chuàng)建多個“abc”字符串,在內(nèi)存中其實只存在一個對象而已。這種寫法有利于節(jié)省內(nèi)存空間。同時還可以提高程序的運(yùn)行速度,因為JVM會自動根據(jù)棧中數(shù)據(jù)的實際情況來決定是否創(chuàng)建新對象。

String str1 = new String("abc");
String str2 = "abc";

附錄:Java中的堆和棧的區(qū)別

java中堆和棧的區(qū)別自然是面試中的常見問題,下面幾點(diǎn)就是其具體的區(qū)別

各司其職

最主要的區(qū)別就是棧內(nèi)存用來存儲局部變量和方法調(diào)用。
而堆內(nèi)存用來存儲Java中的對象。無論是成員變量,局部變量,還是類變量,它們指向的對象都存儲在堆內(nèi)存中。

獨(dú)有還是共享

棧內(nèi)存歸屬于單個線程,每個線程都會有一個棧內(nèi)存,其存儲的變量只能在其所屬線程中可見,即棧內(nèi)存可以理解成線程的私有內(nèi)存。
而堆內(nèi)存中的對象對所有線程可見。堆內(nèi)存中的對象可以被所有線程訪問。

異常錯誤 

如果棧內(nèi)存沒有可用的空間存儲方法調(diào)用和局部變量,JVM會拋出java.lang.StackOverFlowError。
而如果是堆內(nèi)存沒有可用的空間存儲生成的對象,JVM會拋出java.lang.OutOfMemoryError。

空間大小

棧的內(nèi)存要遠(yuǎn)遠(yuǎn)小于堆內(nèi)存,如果你使用遞歸的話,那么你的棧很快就會充滿。如果遞歸沒有及時跳出,很可能發(fā)生StackOverFlowError問題。
你可以通過-Xss選項設(shè)置棧內(nèi)存的大小。-Xms選項可以設(shè)置堆的開始時的大小,-Xmx選項可以設(shè)置堆的最大值。

這就是Java中堆和棧的區(qū)別。理解好這個問題的話,可以對你解決開發(fā)中的問題,分析堆內(nèi)存和棧內(nèi)存使用,甚至性能調(diào)優(yōu)都有幫助。

查看默認(rèn)值(Updated)

查看堆的默認(rèn)值,使用下面的代碼,其中InitialHeapSize為最開始的堆的大小,MaxHeapSize為堆的最大值。

13:17 $ java -XX:+PrintFlagsFinal -version | grep HeapSize
 uintx ErgoHeapSizeLimit    = 0     {product}
 uintx HeapSizePerGCThread   = 87241520    {product}
 uintx InitialHeapSize    := 134217728    {product}
 uintx LargePageHeapSizeThreshold  = 134217728    {product}
 uintx MaxHeapSize    := 2147483648    {product}
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)

查看棧的默認(rèn)值,其中ThreadStackSize為棧內(nèi)存的大小。

13:21 $ java -XX:+PrintFlagsFinal -version | grep ThreadStackSize
 intx CompilerThreadStackSize   = 0     {pd product}
 intx ThreadStackSize    = 1024    {pd product}
 intx VMThreadStackSize    = 1024    {pd product}
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)

總結(jié)

到此這篇關(guān)于Java中堆和棧的概念和區(qū)別的文章就介紹到這了,更多相關(guān)java 堆和棧的概念和區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

裕民县| 浏阳市| 凤阳县| 都兰县| 静海县| 含山县| 惠来县| 米易县| 济宁市| 西宁市| 肇东市| 浑源县| 柳林县| 贡嘎县| 长乐市| 八宿县| 北安市| 泸州市| 札达县| 静乐县| 泰和县| 衡东县| 铜山县| 广德县| 泌阳县| 阿勒泰市| 焉耆| 开原市| 定南县| 饶平县| 榆林市| 吴桥县| 易门县| 壤塘县| 平罗县| 平江县| 普格县| 岑巩县| 新余市| 满城县| 扶沟县|