1. 程式人生 > >Java基礎知識---記憶體區域與記憶體溢位異常

Java基礎知識---記憶體區域與記憶體溢位異常

2.1.棧幀的定義(stack frame):

棧幀是用於支援虛擬機器進行方法呼叫和方法執行的資料結構,它是虛擬機器執行時資料區中的虛擬機器棧的棧元素。棧幀儲存了方法的區域性變量表、運算元棧、動態連線和方法返回地址等資訊。
     每一個方法從呼叫開始到執行完成的過程,就對應著一個棧幀在虛擬機器棧裡面從入棧到出棧的過程。
     對於執行引擎來說,活動執行緒中,只有棧頂的棧幀是有效的,稱為當前棧幀,這個棧幀所關聯的方法稱為當前方法。執行引擎所執行的所有位元組碼指令都只針對當前棧幀進行操作。

2.1.1棧幀的組成
 (1)區域性變量表
      區域性變量表是一組變數值儲存空間,用於存放方法引數和方法內部定義的區域性變數。在Java程式被編譯成Class檔案時,就在方法的Code屬性的max_locals資料項中確定了該方法所需要分配的
      最大區域性變量表的容量。
      區域性變量表的容量以變數槽(Slot)為最小單位,32位虛擬機器中一個Slot可以存放一個32位以內的資料型別(boolean、byte、char、short、int、float、reference和returnAddress八種)。
      reference型別虛擬機器規範沒有明確說明它的長度,但一般來說,虛擬機器實現至少都應當能從此引用中直接或者間接地查詢到物件在Java堆中的起始地址索引和方法區中的物件型別資料。
      returnAddress型別是為位元組碼指令jsr、jsr_w和ret服務的,它指向了一條位元組碼指令的地址。
      虛擬機器是使用區域性變量表完成引數值到引數變數列表的傳遞過程的,如果是例項方法(非static),那麼區域性變量表的第0位索引的Slot預設是用於傳遞方法所屬物件例項的引用,在方法中通過this訪問。
      Slot是可以重用的,當Slot中的變數超出了作用域,那麼下一次分配Slot的時候,將會覆蓋原來的資料。Slot對物件的引用會影響GC(要是被引用,將不會被回收)。
  系統不會為區域性變數賦予初始值(例項變數和類變數都會被賦予初始值)。也就是說不存在類變數那樣的準備階段。
 (2)運算元棧

      Java虛擬機器的解釋執行引擎被稱為"基於棧的執行引擎",其中所指的棧就是指-運算元棧。
      運算元棧也常被稱為操作棧。
     和區域性變數區一樣,運算元棧也是被組織成一個以字長為單位的陣列。但是和前者不同的是,它不是通過索引來訪問,而是通過標準的棧操作—壓棧和出棧—來訪問的。比如,如果某個指令把一個值壓入到運算元棧中,稍後另一個指令就可以彈出這個值來使用。
      虛擬機器在運算元棧中儲存資料的方式和在區域性變數區中是一樣的:如int、long、float、double、reference和returnType的儲存。對於byte、short以及char型別的值在壓入到運算元棧之前,也會被轉換為int。
      虛擬機器把運算元棧作為它的工作區——大多數指令都要從這裡彈出資料,執行運算,然後把結果壓回運算元棧。比如,iadd指令就要從運算元棧中彈出兩個整數,執行加法運算,其結果又壓回到運算元棧中,看看下面的示例,它演示了虛擬機器是如何把兩個int型別的區域性變數相加,再把結果儲存到第三個區域性變數的:


本地方法棧:和虛擬機器棧類似,不過執行的是本地方法


在棧這個記憶體模型中定義了兩種異常,一個是OutOfMemoryError(建立新物件的速度太快,以致於垃圾回收來不及,沒有空間new物件,可以配置引數解決),和StackOverflowError(呼叫函式層級太多,典型的入死遞迴)

3.堆 

有句話是這樣的:當你建立一個物件時,堆用來儲存物件的資料,棧用來儲存對該物件的引用。

堆是java記憶體管理中最大的模組,是被所以的執行緒共享的,辭區域的唯一目的就是存放物件的實力,幾乎所以的物件都是在堆上建立的,(JIT編譯器,逃逸分析技術),是垃圾回收的主要區域,由於目前的垃圾回收機制主要是分代回收,所以堆又分為新生代和老年代,如果堆中沒有空間完成例項分配,並且也無法擴充套件時會報OutOfMemoryError。關於堆這一塊主要在垃圾回收是講


相關推薦

Java基礎知識---記憶體區域記憶體溢位異常

2.1.棧幀的定義(stack frame): 棧幀是用於支援虛擬機器進行方法呼叫和方法執行的資料結構,它是虛擬機器執行時資料區中的虛擬機器棧的棧元素。棧幀儲存了方法的區域性變量表、運算元棧、動態連線和方法返回地址等資訊。      每一個方法從呼叫開始到執行完成的過程,就對應著一個棧幀在虛擬機器棧裡面

學習筆記1:深入理解Java虛擬機器——JVM高階特性最佳實踐_走進java_java記憶體區域記憶體溢位異常

第一部分:走進java Java虛擬機器 程式碼在華章下載 jdk釋出了六個命令列工具和兩個視覺化故障處理工具。 推薦書籍 設計原本 領域特定語言 現在著名的Java虛擬機器 hotspot vm(預設) jrockit vm j9 vm jdk sun jdk op

java虛擬機器—-java記憶體區域記憶體溢位異常

一,java虛擬機器所管理的執行時資料區域分為:程式計數器、java虛擬機器棧、本地方法棧、java堆、方法區、執行時常量池。                     1,程式計數器:

《深入理解Java虛擬機器—JVM高階特性實踐 周志明 著》之第2章 Java記憶體區域記憶體溢位異常

1、Java虛擬機器所管理的記憶體包括以下幾個執行時資料區域: 2、程式計數器:          1. 可以看作是當前執行緒所執行的位元組碼的行號指示器,是一塊較小的記憶體空間;  &nbs

JAVA虛擬機器(JVM)劃重點 第二章 Java記憶體區域記憶體溢位異常 之 虛擬機器物件

本部落格參考《深入理解Java虛擬機器》(第二版)一書,提取重點知識,再加以個人的理解編寫而成。轉載請標明來源。 JAVA虛擬機器(JVM)劃重點 第二章 Java記憶體區域與記憶體溢位異常 之 虛擬機器物件 Java物件的建立 1、類載入過程

JAVA虛擬機器(JVM)劃重點 第二章 Java記憶體區域記憶體溢位異常 之 執行時資料區域

本部落格參考《深入理解Java虛擬機器》(第二版)一書,提取重點知識,再加以個人的理解編寫而成。轉載請標明來源。 JVM劃重點 第二章 Java記憶體區域與記憶體溢位異常 之 執行時資料區域 概述 執行時資料區域 程式計數器 Java虛擬機

《深入理解java虛擬機器》讀書筆記(二)---- Java記憶體區域記憶體溢位異常

執行時資料區域 java虛擬機器所管理的記憶體將會包括以下幾個執行時資料區域: 1、程式計數器 程式計數器是一塊較小的記憶體空間,它可以看作是當前執行緒所執行位元組碼的行號指示器。在虛擬機器的概念模型裡,位元組碼直譯器的工作就是通過改變這個計數器的值來選取下一條需要執

JVM-Java記憶體區域記憶體溢位

JVM虛擬機器執行時資料區結構分為:      其中方法區和堆是所有執行緒共享的記憶體區域,而Java棧、本地方法棧、程式計數器是執行緒私有的。 我們詳細介紹執行時資料區的各個區域及其作用。  程式計數器:   一塊較小的記憶體空間,位元組碼指示器工作時通過改變計數器的值來選取下一條需

Java記憶體區域記憶體溢位

記憶體區域     Java虛擬機器在執行Java程式的過程中會把他所管理的記憶體劃分為若干個不同的資料區域。Java虛擬機器規範將JVM所管理的記憶體分為以下幾個執行時資料區:程式計數器、Java虛擬機器棧、本地方法棧、Java堆、方法區。下面詳細闡述各

虛擬機器學習之一:java記憶體區域記憶體溢位異常

1.執行時資料區域 java虛擬機器在執行java程式的過程中會把它所管理的記憶體劃分為若干個不同的資料區域。這些區域都有各自的用途和建立、銷燬時間,有的區域伴隨虛擬機器程序的啟動而存在,有些區域則依賴使用者執行緒的啟動和結束而建立和銷燬。 1.1程式計數器 程式計數器

Java虛擬機器筆記-1(Java技術體系&自動記憶體管理機制&記憶體區域記憶體溢位&垃圾收集器記憶體分配策略)

世界上沒有完美的程式,但寫程式是不斷追求完美的過程。 Devices(裝置、裝置)、GlassFish(商業相容應用伺服器) 目錄 1. Java技術體系包括: Java技術體系的4個平臺 虛擬機器分類 HotSpot VM 模組化、混合程式設計 多核並行

java記憶體區域記憶體溢位異常

執行是記憶體區域 java虛擬機器在執行java程式的過程中會把它所管理的記憶體劃分為若干個不同的資料區域。 1.執行緒獨有的記憶體區域 (1)程式計數器(Program Counter Register) 這塊記憶體區域很小,它是當前執行緒所執行的位元組碼的行號

【深入Java虛擬機器】之一:Java記憶體區域記憶體溢位

記憶體區域     Java虛擬機器在執行Java程式的過程中會把他所管理的記憶體劃分為若干個不同的資料區域。Java虛擬機器規範將JVM所管理的記憶體分為以下幾個執行時資料區:程式計數器、Java虛擬機器棧、本地方法棧、Java堆、方法區。下面詳細闡述各資料區所儲存的資料型

Java 記憶體區域記憶體溢位異常(二)

一、虛擬機器中Java物件的建立 語言層面上,建立Java物件通常僅僅是一個new關鍵字而已。 在虛擬遇到new指令時: 1、首先檢查這個指令的引數是否能在常量池中定位到一個類的符號引用,並檢查這個類的符號引用代表的類是否已經載入,解析和初始化過。如果沒有,則必須執行類

Java 記憶體區域記憶體溢位異常(三)

實戰:OutOfMemoryError 異常 參考:《深入理解Java虛擬機器》-jvm高階特性與最佳實現(周志明著) 之前的兩篇中介紹Java虛擬機器中各個執行時記憶體區域的作用,這節中通過人為異常的方式驗證各個執行時區儲存的內容 一、Java堆溢位 Java堆中用

Java記憶體區域記憶體溢位異常簡單總結

目錄 1.簡述 2.作用 3.注意 1.簡介 3.異常 1.簡述 1. 簡述 2.異常 1.簡述 2.異常 1.JVM執行時資料區域簡圖 Java虛擬機器執行時資料區 2.程式計數器(Program Co

深入理解java虛擬機器---java記憶體區域記憶體溢位異常---3垃圾回收機制GC

  一、垃圾回收---物件存活演算法:     1、引用計數器法:在物件身上放上一個計數器,當有引用則加一,引用失效則減一,為零則可回收。(無法解決物件相互引用)     2、可達性分析法(java),GC roots為起始點,從節點向下搜尋,搜尋路徑為引用鏈,不在引用鏈的物件則是可回收的物件

(一)JAVA記憶體區域記憶體溢位異常

目錄 0、前沿 1、概述 2、執行時資料區域 2.1、程式計數器 2.2、JAVA虛擬機器棧 2.3、本地方法棧 2.4、JAVA堆 2.5、方法區 2.5.1、執行時常量池 3、HotSpot虛擬機器 3.1、物件的建立 3.2、物件的記憶體佈局

JAVA記憶體區域記憶體溢位異常---------執行時資料區域

執行時資料區域 程式計數器、JAVA 虛擬機器棧、本地方法棧 以及方法區、堆 1 、Program Counter Register  較小的一塊記憶體空間,可看作是當前程式執行的位元組碼的行號指示器。多執行緒中,每個執行緒都需要一個獨立的計數器,各條執行緒的計數器互不

第二章、Java記憶體區域記憶體溢位異常

2.1 概述       對於Java程式設計師來說,虛擬機器具有自動記憶體管理機制,不容易出現記憶體洩漏和記憶體溢位問題。也正是因為Java程式設計師把記憶體控制的機制交給了Java虛擬機器,一旦出現記憶體洩漏和溢位方面的問題,如果不瞭解虛擬機器是怎樣使用記憶體的,那排查