1. 程式人生 > >java中堆和棧的概念解析

java中堆和棧的概念解析

   作為一個java程式設計師,面試的時候有些公司的面試官也許會問到java中堆和棧的概念。當然了,這個中高階java程式設計師才需要掌握的吧。初級java程式設計師如果可以弄明白這方面的知識,肯定也會加分。最近在面試的我就遇到了一個面試官給我出了這個問題。沒有了解過的我很尷尬。回來一看才發現,也就是那麼回事吧。

       本人看的概念來自於《深入理解Java虛擬機器》這本書,這本書可謂是講解JVM原理的一本聖經。

      首先,java中的堆和棧是指什麼呢?這個問題說明了提問者,是將java中的記憶體區分為了堆記憶體和棧記憶體。這是一種粗略的分法。java的記憶體區域可是複雜多了,就好像樓主我在廣州生活,城中村和小區房是我租房最關注的2個地方,但是廣州其他地方的租房也是很複雜的。java程式設計師往往關注的就是堆記憶體和棧記憶體這2個區域。

      我們先來說說堆記憶體,java的堆是java虛擬機器所管理的記憶體中最大的一塊。這個記憶體的唯一目的就是存放物件例項。幾乎所有的物件例項都在這裡分配記憶體(注意不是所有啊)。所以java堆是被所有執行緒所共享的一塊記憶體。在java虛擬機器的規範中,java堆可以處於物理上不連續的記憶體空間,只要邏輯上是連續的就好。和我們的電腦磁碟空間是一樣的。如果在堆中沒有記憶體可供使用做例項分配,並且堆也沒有擴充套件的時候,就會出現OutOfMemoryError異常。

     再來看看java 的棧記憶體。它的真正名稱叫做:java虛擬機器棧。它和java堆記憶體的有一個很大的區別在於,它是執行緒私有的。它的生命週期也和執行緒的生命週期捆綁在一起。 每個java方法在執行的時候都會建立一個棧幀用來儲存區域性變量表,運算元棧,動態連結,方法出口等資訊。每一個方法從呼叫直至完成執行後的過程,就對應著一個棧幀在虛擬機器棧中的入棧到出棧的過程。在java虛擬機器棧中,區域性變量表所需要的記憶體空間在編譯期間完成分配的。也就是說在進入一個方法時,這個方法在幀中分配多大的區域性變數空間是完全確定的,在方法執行期間不會改變區域性變量表的大小。那如果這個方法的執行緒所需要的記憶體大於這個空間呢?結果是會丟擲OutOfMemoryError異常。另外如果執行緒請求的棧深度大於虛擬機器所設的深度,將丟擲 StackOverflowError異常。

相關推薦

java概念解析

   作為一個java程式設計師,面試的時候有些公司的面試官也許會問到java中堆和棧的概念。當然了,這個中高階java程式設計師才需要掌握的吧。初級java程式設計師如果可以弄明白這方面的知識,肯定

Java的基本概念

Java把記憶體分成兩種,一種叫做棧記憶體,一種叫做堆記憶體。 在函式中定義的一些基本型別的變數和物件的引用變數都是在函式的棧記憶體中分配。當在一段程式碼塊中定義一個變數時,java就在棧中為這個變數分配記憶體空間,當超過變數的作用域後,java會自動釋放掉為該變數

java的區別

mem 線程 所有 生成 werror 空間 調用 訪問 指向 01,各司其職;         棧內存用來存儲局部變量和方法的調用,         而堆內存用來存儲java中的對象,無論是成員變量,局部變量,還是類變量         他們指向的對象都存儲在堆內存中。

java

內存空間 獲取 位置 是什麽 創建一個數組 有一個 必須 靈活 先進後出 什麽是堆 堆內存是Java內存中的一種,它的作用是用於存儲Java中的對象和數組,當我們new一個對象或者創建一個數組的時候,就會在堆內存中開辟一段空間給它,用於存放。 堆內存的特點是什麽? (1)

Java的區別在什麼地方?

堆和棧都是Java用來在RAM中存放資料的地方。 堆 (1)Java的堆是一個執行時資料區,類的物件從堆中分配空間。這些物件通過new等指令建立,通過垃圾回收器來銷燬。 (2)堆的優勢是可以動態地分配記憶體空間,需要多少記憶體空間不必事先告訴編譯器,因為它是在執行時動態

Java區別

在函式中定義的一些基本型別的變數和物件的引用變數都在函式的棧記憶體中分配。      當在一段程式碼塊定義一個變數時,Java就在棧中為這個變數分配記憶體空間,當超過變數的作用域後,Java會自動釋放掉為該變數所分配的記憶體空間,該記憶體空間可以立即被另作他用。  

C++的完全解析

C++中堆和棧的完全解析 記憶體分配方面: 堆: 作業系統有一個記錄空閒記憶體地址的連結串列,當系統收到程式的申請時,會遍歷該連結串列,尋找第一個空間大於所申請空間的堆結點,然後將該結點從空閒結點連結串列中刪 除,並將該結點的空間分配給程式,另外,對於大多數系統,會在

讓你徹底明白JAVA的區別

java程序 運行 一點 動態 自動變 key 空間 類型 lin 原文地址:http://www.2cto.com/kf/201302/190704.html 簡單的說: Java把內存劃分成兩種:一種是棧內存,一種是堆內存。 在函數中定義的一些基本類型的變量和對象的引用

iOS的區別

IE http sdn 改變 執行 需要 獨立 clas 類方法 https://blog.csdn.net/wallacewang_/article/details/72594977 類方法 當不需要訪問實例變量或者不改變實例狀態時,可寫成類方法。 Objec

JAVA,解釋

JVM將JAVA儲存內容在記憶體中分為5個區,現在講最重要的3個區: 例子: int a  = 1; int b = a; b = 3; class dog { private String name; }       do

資料結構記憶體的區別

特別宣告:本文參考了部落格:http://blog.csdn.net/wolenski/article/details/7951961#comments        堆和棧在 我的眼裡一直是很模糊的概念,只是簡單的理解為:堆疊是一種資料結構,是用來儲存資料的。由於最近

【轉】C++的理解

一、預備知識—程式的記憶體分配 一個由c/C++編譯的程式佔用的記憶體分為以下幾個部分 1、棧區(stack)— 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。 2、堆區(heap) — 一般由程式設計師分配釋放, 若程式設計

全程剖析C語言的區別

1.申請方式 (1)棧(satck):由系統自動分配。例如,宣告在函式中一個區域性變數int b;系統自動在棧中為b開闢空間。 (2)堆(heap):需程式設計師自己申請(呼叫malloc,realloc,calloc),並指明大小,並由程式設計師進行釋放。容易產生memory leak. eg:

Java的關係

資料型別     Java虛擬機器中,資料型別可以分為兩類:基本型別和引用型別。基本型別的變數儲存原始值,即:他代表的值就是數值本身;而引用型別的變數儲存引用值。“引用值”代表了某個物件的引用,而不是物件本身,物件本身存放在這個引用值所表示的地址的位置。 基本型別包括:byte,short,int,long

C語言的區別

格式和部分內容稍作修改。 在計算機領域,堆疊是一個不容忽視的概念,我們編寫的C語言程式基本上都要用到。但對於很多的初學著來說,堆疊是一個很模糊的概念。堆疊:一種資料結構、一個在程式執行時用於存放的地方,這可能是很多初學者的認識,因為我曾經就是這麼想的和組合語言中的堆疊一

c++的的區別(stack vs heap)

 堆和棧的區別一、預備知識—程式的記憶體分配一個由c/C++編譯的程式佔用的記憶體分為以下幾個部分1、棧區(stack)— 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2、堆區(heap) — 一般由程式設計師分配釋放, 

JVM的區別

動態分配內存 分配內存 err ava error tof over 可用 flow 1、棧是線程私有的;堆事線程公有的。2、棧主要用於存儲局部變量和對象的引用變量;堆主要用於存儲實例化的對象,數組,由JVM動態分配內存空間。3、棧中的變量超過其作用域後,JVM會自動釋放掉

記憶體的區別

原文: http://student.csdn.net/link.php?url=http://www.top-e.org%2Fjiaoshi%2Fhtml%2F427.html 在計算機領域,堆疊是一個不容忽視的概念,我們編寫的C語言程式基本上都要用到。但對於很多的初學著

Java的區別

1. 棧(stack)與堆(heap)都是Java用來在Ram中存放資料的地方。與C++不同,Java自動管理棧和堆,程式設計師不能直接地設定棧或堆。   2. 棧的優勢是,存取速度比堆要快,僅次於直接位於CPU中的暫存器。但缺點是,存在棧中的資料大小與生存期必須是確定的,缺乏靈活性。另外,棧資料可以共享,詳

Java

同時 存在 堆棧 color 特殊性 垃圾回收器 速度 自動釋放 靈活  Java把內存劃分成兩種:一種是棧內存,一種是堆內存。 在Java中所有對象的存儲空間都是在堆中分配的,但是這個對象的引用卻是在堆棧中分配,也就是說在建立一個對象時從兩個地方都分配內存,在堆中