Java中堆和棧的差別詳解。本站提示廣大學習愛好者:(Java中堆和棧的差別詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是Java中堆和棧的差別詳解正文
當一小我開端進修Java或許其他編程說話的時刻,會接觸到堆和棧,因為一開端沒有明白清楚的解釋說明,許多人會發生許多疑問,甚麼是堆,甚麼是棧,堆和棧有甚麼差別?更蹩腳的是,Java中存在棧如許一個落後先出(Last In First Out)的次序的數據構造,這就是java.util.Stack。這類情形下,難免讓許多人加倍隱晦後面的成績。現實上,堆和棧都是內存中的一部門,有著分歧的感化,並且一個法式須要在這片區域上分派內存。盡人皆知,一切的Java法式都運轉在JVM虛擬機外部,我們這裡引見的天然是JVM(虛擬)內存中的堆和棧。
差別
java中堆和棧的差別天然是面試中的罕見成績,上面幾點就是其詳細的差別
各司其職
最重要的差別就是棧內存用來存儲部分變量和辦法挪用。
而堆內存用來存儲Java中的對象。不管是成員變量,部分變量,照樣類變量,它們指向的對象都存儲在堆內存中。
獨有照樣同享
棧內存歸屬於單個線程,每一個線程都邑有一個棧內存,其存儲的變量只能在其所屬線程中可見,即棧內存可以懂得成線程的公有內存。
而堆內存中的對象對一切線程可見。堆內存中的對象可以被一切線程拜訪。
異常毛病
假如棧內存沒有可用的空間存儲辦法挪用和部分變量,JVM會拋出java.lang.StackOverFlowError。
而假如是堆內存沒有可用的空間存儲生成的對象,JVM會拋出java.lang.OutOfMemoryError。
空間年夜小
棧的內存要遠遠小於堆內存,假如你應用遞歸的話,那末你的棧很快就會充斥。假如遞歸沒有實時跳出,極可能產生StackOverFlowError成績。
你可以經由過程-Xss選項設置棧內存的年夜小。-Xms選項可以設置堆的開端時的年夜小,-Xmx選項可以設置堆的最年夜值。
這就是Java中堆和棧的差別。懂得好這個成績的話,可以對你處理開辟中的成績,剖析堆內存和棧內存應用,乃至機能調優都有贊助。
檢查默許值(Updated)
檢查堆的默許值,應用上面的代碼,個中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)
檢查棧的默許值,個中ThreadStackSize為棧內存的年夜小。
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)
譯文信息
原汁原味的英文原文:http://javarevisited.blogspot.com.au/2013/01/difference-between-stack-and-heap-java.html.
譯文在原文基本長進行了修正,整頓,刪減。若有興致可以拜訪原文。P.S.地址已被牆。