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中常量定義在interface和class的區別(轉)var tac 不能被繼承 ble -o err 模式 variable 個人愛好 最終結論:定義常量在interface和class中其實都行,關鍵是看你的設計和個人愛好。 Java中interface中定義變量默認都是"public static final"類型的, JFrame和JInternalFrame示例學習(轉)splay wid and eat oca nds etc idt bar 1. 創建主窗體並簡單建立菜單項,示例代碼如下: package internalFrame; import javax.swing.JInternalFrame; import javax.s HTTPS和HTTP的區別(轉)cap 解決 加密方法 nbsp 快速 之間 cape 而不是 銀行 什麽是 HTTPS? HTTPS (基於安全套接字層的超文本傳輸協議 或者是 HTTP over SSL) 是一個 Netscape 開發的 Web 協議。 你也可以說:HTTPS = HTTP + SS URI和URL的區別(轉)ado 網絡資源 時也 fontsize 能夠 ren 文檔 自身 p地址 1說明: 這段時間寫android的時候用到了URL和URI,有點分不清楚,於是做了一個系統性的學習。在這裏將自己的學習筆記粘貼出來,希望對大家有幫助。 1)Java類庫裏有兩個對應的類java.n Servlet中forward和redirect的區別(轉)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中Integer和int的區別(轉)prev 指針 引用 .com 地址 區別 val details sdn int和Integer的區別 1、Integer是int的包裝類,int則是java的一種基本數據類型 2、Integer變量必須實例化後才能使用,而int變量不需要 3、Integer實際是對象 MingW和cygwin的區別(轉)個人總結:讀完這段文字需要5分支 總結: MingW是一個編譯器 https://zh.wikipedia.org/wiki/MinGW Cygwin是一組套件 https://zh.wikipedia.org/wiki/Cygwin MingW和cygwin的區別 |