1. 程式人生 > >【JVM】記憶體模型

【JVM】記憶體模型

這裡寫圖片描述

執行緒共享:方法區、堆
執行緒獨享:虛擬機器棧、本地方法棧、程式計數器

方法區:

方法區在一個jvm例項的內部,型別資訊被儲存在一個稱為方法區的記憶體邏輯區中。型別資訊是由類載入器在類載入時從類檔案中提取出來的。類(靜態)變數也儲存在方法區中。
簡單說方法區用來儲存型別的元資料資訊,一個.class檔案是類被java虛擬機器使用之前的表現形式,一旦這個類要被使用,java虛擬機器就會對其進行裝載、連線(驗證、準備、解析)和初始化。而裝載(後的結果就是由.class檔案轉變為方法區中的一段特定的資料結構。這個資料結構會儲存如下資訊:型別資訊、欄位資訊、方法資訊、其他( 除了常量以外的所有類(靜態)變數、一個指向ClassLoader的指標、一個指向Class物件的指標、常量池)

堆:

堆是Java 虛擬機器所管理的記憶體中最大的一塊。Java 堆是被所有執行緒共享的一塊記憶體區域,在虛擬機器啟動時建立。此記憶體區域的唯一目的就是存放物件例項,幾乎所有的物件例項都在這裡分配記憶體。堆是垃圾收集器管理的主要區域,因此很多時候也被稱做“GC 堆”。
堆的大小可以通過-Xms(最小值)和-Xmx(最大值)引數設定,
-Xms為JVM啟動時申請的最小記憶體,預設為作業系統實體記憶體的1/64但小於1G
-Xmx為JVM可申請的最大記憶體,預設為實體記憶體的1/4但小於1G,預設當空餘堆記憶體小於40%時,JVM會增大Heap到-Xmx指定的大小,可通過
-XX:MinHeapFreeRation=來指定這個比列;
當空餘堆記憶體大於70%時,JVM會減小heap的大小到-Xms指定的大小,可通過XX:MaxHeapFreeRation=來指定這個比列,對於執行系統,為避免在執行時頻繁調整Heap的大小,通常-Xms與-Xmx的值設成一樣。

如果從記憶體回收的角度看,由於現在收集器基本都是採用的分代收集演算法,所以Java 堆中還可以細分為:新生代和老年代;
新生代:程式新建立的物件都是從新生代分配記憶體,新生代由Eden Space和兩塊相同大小的Survivor Space(通常又稱S0和S1或From和To)構成,可通過-Xmn引數來指定新生代的大小,也可以通過-XX:SurvivorRation來調整Eden Space及SurvivorSpace的大小。
老年代:用於存放經過多次新生代GC仍然存活的物件,例如快取物件,新建的物件也有可能直接進入老年代,主要有兩種情況:1、大物件,可通過啟動引數設定-XX:PretenureSizeThreshold=1024(單位為位元組,預設為0)來代表超過多大時就不在新生代分配,而是直接在老年代分配。2、大的陣列物件,且陣列中無引用外部物件。
老年代所佔的記憶體大小為-Xmx對應的值減去-Xmn對應的值。

如果在堆中沒有記憶體完成例項分配,並且堆也無法再擴充套件時,將會丟擲OutOfMemoryError 異常。

虛擬機器棧:

執行緒私有,他的生命週期和執行緒相同
虛擬機器棧描述的是Java 方法執行的記憶體模型:每個方法被執行的時候都會同時建立一個棧幀(Stack Frame)用於儲存區域性變量表、操作棧、動態連結、方法出口等資訊。
動畫是由一幀一幀圖片連續切換結果的結果而產生的,其實虛擬機器的執行和動畫也類似,每個在虛擬機器中執行的程式也是由許多的幀的切換產生的結果,只是這些幀裡面存放的是方法的區域性變數,運算元棧,動態連結,方法返回地址和一些額外的附加資訊組成。每一個方法被呼叫直至執行完成的過程,就對應著一個棧幀在虛擬機器棧中從入棧到出棧的過程。

本地方法棧:

與虛擬機器棧所發揮的作用是非常相似的,其區別不過是虛擬機器棧為虛擬機器執行Java 方法(也就是位元組碼)服務,而本地方法棧則是為虛擬機器使用到的Native 方法服務。虛擬機器規範中對本地方法棧中的方法使用的語言、使用方式與資料結構並沒有強制規定,因此具體的虛擬機器可以自由實現它。甚至有的虛擬機器(譬如Sun HotSpot 虛擬機器)直接就把本地方法棧和虛擬機器棧合二為一。
與虛擬機器棧一樣,本地方法棧區域也會丟擲StackOverflowError和OutOfMemoryError異常

程式計數器:

程式計數器是一塊較小的記憶體空間,可以看作是當前執行緒所執行的位元組碼的行號指示器。分支、迴圈、跳轉、異常處理、執行緒恢復等基礎功能都需要依賴這個計數器來完成。
由於Java 虛擬機器的多執行緒是通過執行緒輪流切換並分配處理器執行時間的方式來實現的,在任何一個確定的時刻,一個處理器(對於多核處理器來說是一個核心)只會執行一條執行緒中的指令。因此,為了執行緒切換後能恢復到正確的執行位置,每條執行緒都需要有一個獨立的程式計數器,各條執行緒之間的計數器互不影響,獨立儲存,我們稱這類記憶體區域為“執行緒私有”的記憶體。
如果執行緒正在執行的是一個Java 方法,這個計數器記錄的是正在執行的虛擬機器位元組碼指令的地址;
如果正在執行的是Natvie 方法,這個計數器值則為空(Undefined)。
此記憶體區域是唯一一個在Java 虛擬機器規範中沒有規定任何OutOfMemoryError情況的區域。

相關推薦

JVM記憶體模型

執行緒共享:方法區、堆 執行緒獨享:虛擬機器棧、本地方法棧、程式計數器 方法區: 方法區在一個jvm例項的內部,型別資訊被儲存在一個稱為方法區的記憶體邏輯區中。型別資訊是由類載入器在類

JVM——記憶體模型

(一)總體架構圖 (二)簡介 程式計數器:當前執行緒執行的位元組碼的行號指示器。執行緒私有。 java虛擬機器棧:執行緒私有。虛擬機器棧描述的是虛擬機器執行Java方法執行的記憶體模型:每個方法被

JVM系列4記憶體模型

## JVM系列筆記目錄 > - 虛擬機器的基礎概念 > - class檔案結構 > - class檔案載入過程 > - jvm記憶體模型 > - JVM常用指令 > - GC與調優 ### 硬體層資料一致性 #### - 儲存器層次結構 ![file](ht

JVM記憶體分析<一>工具的使用

一. 獲取堆快照 1、出現OOME時生成堆dump: #出現 OOME 時生成堆 dump: -XX:+HeapDumpOnOutOfMemoryError #生成堆檔案地址: -XX:HeapDumpPath=/home/liuke/jvmlogs/ View Code

JVM記憶體區域分配機制和記憶體溢位異常

前言:    對於Java和C類語言來說,它們二者之間存在一個很大的區別:記憶體動態分配和垃圾回收機制(GC)。對於C 或C++來說,它們的記憶體管理是有開發人員決定的,也就是收一個物件的生存週期各

jvmjvm記憶體模型

前言: jvm的記憶體模型,應該是每個"高階java"程式猿必備的知識儲備了,各大公司對高階的要求裡幾乎都有提到"深入理解Jvm的記憶體模型...",其實當你深入的理解了jvm的記憶體模型後,在以後程式碼的開發中,你會對變數,常量,類,方法的生命週期及作用域,異常等有更深入的理解,而不是像新手一樣生

JVM上帝視角看JVM記憶體模型,分而治之論各模組詳情

1. 上帝視角【樹看JVM】【圖看JVM】2. 分而治之 2.1 堆區    構成:堆區由新生代和老年代組成,新生代中包含伊甸區(Eden)、倖存者區(survivor from 、survivor to)和老年代。    GC:當建立新的物件時,物件首先會被放入Eden和s

JavaJVMJava中JVM記憶體管理 2018-10-5

Java中JVM記憶體管理 JVM記憶體劃分: ① 方法區 (執行緒共享) 常量 靜態變數 JIT(即時編譯器)編譯後代碼也在方法區存放 ② 堆記憶體(執行緒共享) 垃圾回收的主要場地 ③

jvm堆外記憶體

Direct Memory是受GC控制的,例如ByteBuffer bb = ByteBuffer.allocateDirect(1024),這段程式碼的執行會在堆外佔用1k的記憶體,Java堆內只會佔用一個物件的指標引用的大小,堆外的這1k的空間只有當bb物件被回收時,才會被回收,這裡會發現一個明顯的不對稱

JVM程式設計師進階JVM(一)——Java記憶體區域

一、前言       這篇部落格起,小編會向一個更加深層次、逼格滿滿的區域進發——JVM。       可以說JVM不是一個新鮮的東西,但是做java的都會了解JVM,都聽過JVM。有的時候我們寫的程式碼執行跟JVM也有關係。 二、JVM介紹    

JVM配置jvm記憶體

       在進行java開發時發現自己的JBoss啟動的特別特別慢,我的電腦是4G記憶體加128G固態硬碟,僅僅是開啟eclipse和JBoss就卡的不要不要的,更重要的是做專案中,JBoss部

JVMJava記憶體詳解:堆和棧的區別

最近在研究多執行緒的東西,看到了Java記憶體的相關知識。又回到了堆和棧這個話題,在很早之前就研究過,只知道這兩種資料結構一個是先進後出,一個是先進先出,借這個機會,再細緻研究一下,對比二者的不同: Java把記憶體劃分為兩種:一種是棧記憶體,一種是堆記憶體。

JVM記憶體與垃圾回收篇JVM與Java體系結構

# JVM與Java體系結構 ## 前言 作為 Java 工程師的你曾被傷害過嗎?你是否也遇到過這些問題? 執行著的線上系統突然卡死,系統無法訪問,甚至直接 OOM(out of memory)! - 想解決線上 JVM GC 問題,但卻無從下手。 - 新專案上線,對各種 JVM 引數設定一臉茫然,直

JVM記憶體與垃圾回收篇類載入子系統

# 類載入子系統 ## 概述 ![](https://img2020.cnblogs.com/blog/1542615/202007/1542615-20200713205844260-855669260.png) 完整圖如下: ![](https://img2020.cnblogs.com/blo

JVM記憶體與垃圾回收篇執行時資料區概述及執行緒

# 執行時資料區概述及執行緒 ## 前言 本節主要講的是執行時資料區,也就是下圖這部分,它是在類載入完成後的階段 ![](https://img2020.cnblogs.com/blog/1542615/202007/1542615-20200713210432252-2095338296.png)

JVM記憶體與垃圾回收篇物件例項化記憶體佈局與訪問定位

# 物件例項化記憶體佈局與訪問定位 從各自具體的**記憶體分配**上來講 new 的物件放在**堆**中 物件所屬的型別資訊是放在**方法區**的 方法當中的區域性變數放在**棧空間** 這 new 的物件怎麼把三塊粘合到一起 就是這章的內容了 ## 物件例項化 ### 面試題 **美團:** - 物

併發程式設計- 記憶體模型(針對JSR-133記憶體模型)篇

併發程式設計模型 ================= + ### 1.兩個關鍵問題 + #### 1)執行緒之間如何通訊 + 共享記憶體 `程之間共享程式的公共狀態,通過寫-讀記憶體中的公共狀態進行隱式通訊` + 訊息傳遞 `程之間沒有公共狀態,執行緒之間必須通過傳送訊息來顯式進行通訊` + #### 2)

分析師股票模型構建

-1 模型 神經網絡 如何 name 建立 log 盈利 初步 采用神經網絡算法(神經網絡是要求最小的預測誤差,ok的),可以借鑒地震預測模型,每月或者一周更新一次數據,加入多個因子變量,盈利預測:兩三個月更新一次,每個月不更新的時候賦值為0,更新的時候加進去。先制作一個e

JVM6、聊聊JVM常用參數設置

閾值 policy 虛擬機棧 時間戳 ces 增加 action 垃圾 容易 整體考慮堆大小 -Xms3550m, 初始化堆大小。通常情況和-Xmx大小設置一樣,避免虛擬機頻繁自動計算後調整堆大小。 -Xmx3550m,最大堆大小。 考慮分代設置堆大小 首先通過jstat等

FlaskORM模型創建及數據庫映射

class 重新 div Coding database utf OS spa alc 1. 用 declarative_base 根據 engine 創建一個ORM基類。2. 用 Base 類作為基類來寫自己的ORM類。要定義 __tablename__ 類屬性,來指