1. 程式人生 > >Java8記憶體模型—永久代(PermGen)和元空間(Metaspace)(轉)

Java8記憶體模型—永久代(PermGen)和元空間(Metaspace)(轉)

一、JVM 記憶體模型

  根據 JVM 規範,JVM 記憶體共分為虛擬機器棧、堆、方法區、程式計數器、本地方法棧五個部分。

  1、虛擬機器棧:每個執行緒有一個私有的棧,隨著執行緒的建立而建立。棧裡面存著的是一種叫“棧幀”的東西,每個方法會建立一個棧幀,棧幀中存放了區域性變量表(基本資料型別和物件引用)、運算元棧、返回地址等資訊。棧的大小可以固定(編譯時確定)也可以動態擴充套件。當棧呼叫深度大於JVM所允許的範圍,會丟擲StackOverflowError的錯誤,不過這個深度範圍不是一個恆定的值,我們通過下面這段程式可以測試一下這個結果:

棧溢位測試原始碼:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package com.paddx.test.memory; public class StackErrorMock { private static int index = 1; public void call(){ index++; call(); } public static void main(String[] args) { StackErrorMock mock = new StackErrorMock(); try { mock.call(); }catch (Throwable e){
System.out.println("Stack deep : "+index); e.printStackTrace(); } } }

程式碼段 1

執行三次,可以看出每次棧的深度都是不一樣的,輸出結果如下

至於紅色框裡的值是怎麼出來的,就需要深入到 JVM 的原始碼中才能探討,這裡不作詳細闡述。

虛擬機器棧除了上述錯誤外,還有另一種錯誤,那就是當申請不到空間時,會丟擲 OutOfMemoryError。這裡有一個小細節需要注意,catch 捕獲的是 Throwable,而不是 Exception。因為 StackOverflowError 和 OutOfMemoryError 都不屬於 Exception 的子類。

  2、本地方法棧:

  這部分主要與虛擬機器用到的 Native 方法相關,一般情況下, Java 應用程式設計師並不需要關心這部分的內容。

  3、PC 暫存器:

  PC 暫存器,也叫程式計數器。JVM支援多個執行緒同時執行,每個執行緒都有自己的程式計數器。倘若當前執行的是 JVM 的方法,則該暫存器中儲存當前執行指令的地址;倘若執行的是native 方法,則PC暫存器中為空。

  4、堆

  堆記憶體是 JVM 所有執行緒共享的部分,在虛擬機器啟動的時候就已經建立。所有的物件和陣列都在堆上進行分配。這部分空間可通過 GC 進行回收。當申請不到空間時會丟擲 OutOfMemoryError。下面我們簡單的模擬一個堆記憶體溢位的情況:

1 2 3 4 5 6 7 8 9 10 11

相關推薦

Java8記憶體模型永久(PermGen)空間(Metaspace)

一、JVM 記憶體模型   根據 JVM 規範,JVM 記憶體共分為虛擬機器棧、堆、方法區、程式計數器、本地方法棧五個部分。   1、虛擬機器棧:每個執行緒有一個私有的棧,隨著執行緒的建立而建立。棧裡面存著的是一種叫“棧幀”的東西,每個方法會建立一個棧幀,棧幀中存放了區域性變量表(基本資料型別和物

Java8記憶體模型永久(PermGen)空間(Metaspace)

一、JVM 記憶體模型   根據 JVM 規範,JVM 記憶體共分為虛擬機器棧、堆、方法區、程式計數器、本地方法棧五個部分。   1、虛擬機器棧:每個執行緒有一個私有的棧,隨著執行緒的建立而建立。棧裡面存著的是一種叫“棧幀”的東西,每個方法會建立一個棧幀,棧幀中存

Java8內存模型永久(PermGen)空間(Metaspace)

為什麽 基本數據類型 字面量 類對象 mbo 選項 重新 tro bubuko 一、JVM 內存模型   根據 JVM 規範,JVM 內存共分為虛擬機棧、堆、方法區、程序計數器、本地方法棧五個部分。   1、虛擬機棧:每個線程有一個私有的棧,隨著線程的創建而創建。棧裏面存

Java8永久(PermGen)空間(Metaspace)

一、PermGen(永久代)      絕大部分 Java 程式設計師應該都見過 "java.lang.OutOfMemoryError: PermGen space "這個異常。這裡的 “PermGen space”其實指的就是方法區。不過方法區和“PermGen spa

Java8內存結構—永久(PermGen)空間(Metaspace)

比較 存儲 www. 解釋 ati ron println new max 本文轉載 作者:liuxiaopeng 博客地址:https://www.cnblogs.com/paddix/p/5309550.html 一、JVM 內存結構   根據 JVM 規範,JVM

Java8記憶體模型—從永久(PermGen)到空間(Metaspace)

一、JVM 記憶體模型   根據 JVM 規範,JVM 記憶體共分為虛擬機器棧、堆、方法區、程式計數器、本地方法棧五個部分。   1、虛擬機器棧:每個執行緒有一個私有的棧,隨著執行緒的建立而建立。棧裡面存著的是一種叫“棧幀”的東西,每個方法會建立一個棧幀,棧幀中存放了區域

java 8中撤銷永久,引入空間

問題 java 8 性能問題 ror 虛擬機 rac 錯誤 元空間 規範 撤銷永久代,引入元空間:   在 JDK 1.8 中,HotSpot 已經沒有 “PermGen space”這個空間了,取而代之是一個叫做 Metaspace(元空間) 的東西。   Java7中已

數據結構-深度遍歷廣度遍歷

指針 void 邊表 當前 初始化 循環隊列 logs == ont 本文轉自http://blog.csdn.net/wingofeagle/article/details/13020373 深度遍歷: 從圖中某個頂點v出發,訪問此頂點,然後從v的未被訪問的鄰接點出發

Spring3 MVC 註解---註解基本配置及@controller @RequestMapping 常用解釋

nal context pac 配置 註解 com inf 如何 文件中 一:配置web.xml 1)問題:spring項目中有多個配置文件mvc.xml dao.xml 2)解決:在web.xml中 <init-par

Java中常量定義在interfaceclass的區別

var tac 不能被繼承 ble -o err 模式 variable 個人愛好 最終結論:定義常量在interface和class中其實都行,關鍵是看你的設計和個人愛好。 Java中interface中定義變量默認都是"public static final"類型的,

JFrameJInternalFrame示例學習

splay wid and eat oca nds etc idt bar 1. 創建主窗體並簡單建立菜單項,示例代碼如下: package internalFrame; import javax.swing.JInternalFrame; import javax.s

HTTPSHTTP的區別

cap 解決 加密方法 nbsp 快速 之間 cape 而不是 銀行 什麽是 HTTPS? HTTPS (基於安全套接字層的超文本傳輸協議 或者是 HTTP over SSL) 是一個 Netscape 開發的 Web 協議。 你也可以說:HTTPS = HTTP + SS

URIURL的區別

ado 網絡資源 時也 fontsize 能夠 ren 文檔 自身 p地址 1說明: 這段時間寫android的時候用到了URL和URI,有點分不清楚,於是做了一個系統性的學習。在這裏將自己的學習筆記粘貼出來,希望對大家有幫助。 1)Java類庫裏有兩個對應的類java.n

Servlet中forwardredirect的區別

intern host 邏輯 overflow IT lan 實時性 解析 relative forward方式:request.getRequestDispatcher("/somePage.jsp").forwardrequest, response); red

AIX文件系統存儲部署

log 日常 修改 語法 使用 顯示文件 chl 由於 系統 文件系統和存儲部署 文件系統的管理是AIX存儲結構中的最後一環。定義完lv後,可采用如下兩種方式使用lv: a.作為裸設備(raw)使用,一般是數據庫型的應用 b.在lv上定義文件系統,並提供文件和數據的存儲服務

hadoop學習筆記:hdfs體系結構讀寫流程

sim 百萬 服務器 發表 繼續 什麽 lose 基於 一次 原文:https://www.cnblogs.com/codeOfLife/p/5375120.html 目錄 HDFS 是做什麽的 HDFS 從何而來 為什麽選擇 HDFS 存儲數據 HDFS

如何優化JAVA碼及提高執行效率

car jdk nts 外部 ast 兩種 泛型 copy app 可供程序利用的資源(內存、CPU時間、網絡帶寬等)是有限的,優化的目的就是讓程序用盡可能少的資源完成預定的任務。優化通常包含兩方面的內容:減小代碼的體積,提高代碼的運行效率。本文討論的主要是如何提高代碼的效

Win7+Ubuntu雙系統結構下,Ubuntu克隆至新硬碟,啟動成功 Linux下檢視硬碟UUID修改硬碟UUID

前言梗概: 750GB 機械硬碟下安裝 Win7 和 Ubuntu雙系統,之前Win7單獨重灌後,將grub引導覆蓋;利用EasyBCD恢復Ubuntu啟動。 最近發現之前Ubuntu分配空間太小,想將其安裝到一個大一點的SSD(固態硬碟)上。 Ubuntu情況如下, /dev/s

java中Integerint的區別

prev 指針 引用 .com 地址 區別 val details sdn int和Integer的區別 1、Integer是int的包裝類,int則是java的一種基本數據類型 2、Integer變量必須實例化後才能使用,而int變量不需要 3、Integer實際是對象

MingWcygwin的區別

個人總結:讀完這段文字需要5分支 總結: MingW是一個編譯器 https://zh.wikipedia.org/wiki/MinGW   Cygwin是一組套件 https://zh.wikipedia.org/wiki/Cygwin   MingW和cygwin的區別