程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java中堆和棧的差別詳解

Java中堆和棧的差別詳解

編輯:關於JAVA

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.地址已被牆。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved