1. 程式人生 > >JVM記憶體管理,虛擬機器堆疊的理解

JVM記憶體管理,虛擬機器堆疊的理解

前言:C或者C++的記憶體申請和銷燬需要程式設計師自己控制,很容易記憶體洩漏和記憶體溢位且出現問題查詢困難。Java在記憶體管理的優勢在於jvm自己申請和銷燬記憶體,不需要程式設計師關注記憶體問題,更專注於業務邏輯。那為什麼我們還需要理解JVM的記憶體管理機制和原理呢?第一、作為有追求的程式猿應該追根刨底,做到知自知彼;第二、當記憶體管理成為系統性能瓶頸時或者出現記憶體洩漏、記憶體溢位問題,程式猿只有瞭解JVM的記憶體原理才能夠去優化和查詢記憶體問題。

先上圖,給各位同學有個JVM記憶體整體的概念,下面會介紹虛擬機器的記憶體各個區域,這個是理解JVM的第一步。


程式計數器

程式計數器是位元組碼直譯器執行位元組碼的行號指示,存放當前正在執行的位元組碼的地址。java多執行緒是通過執行緒輪流切換來獲取處理器的執行時間,任何一個時刻,一個處理器只能處理一個執行緒的位元組碼,為了在切換執行緒後能恢復到正確的程式碼位置,所以每個執行緒都有自己獨立的程式計數器
。此記憶體區域是jvm中唯一沒有OutOfMemeryError的區域。

虛擬機器棧

經常說的堆和棧只是泛指程式猿比較關注的是這兩塊記憶體區域,實際記憶體區域不止堆和棧。虛擬機器棧也是執行緒私有的,它的生命週期和執行緒一樣。虛擬機器棧是java方法執行的記憶體模型,主要記錄區域性變量表、運算元棧、動態連結、方法出口資訊等,每次方法的執行都伴隨著棧幀的入棧和出棧。 區域性變量表主要存放byte、short、int、char、boolean、long、float、double 這8種基本型別、物件引用。 虛擬機器棧區域會報StackOverflowError和OutMemoryError錯誤,當請求的棧深度超過虛擬機器棧的最大深度,會報StackOverflowError;若虛擬機器棧自動擴容,當擴容時沒有足夠的記憶體時會報OutMemoryError錯誤。

本地方法棧

虛擬機器棧是為呼叫java方法服務,本地方法棧是為呼叫本地native方法服務

堆(Heap)

堆是記憶體中最大的一塊區域,用來存放陣列、物件例項,是java 垃圾回收的主要物件,也稱為gc堆,也是程式猿最關注的記憶體區域。可以通過-Xms(最小堆記憶體)、-Xmx(最大堆記憶體)來設定堆的大小。 為了提高堆記憶體的利用率和垃圾回收的效率,堆記憶體分年輕代和老年代,年輕代為Eden、From Survivor、To Survivor,一般三個代的大小比例為8:1:1,為什麼要設定兩個Survivor代呢?因為新建立的物件都會進入Eden代,大部分Eden代的物件都是朝生夕死的,在年輕代通過複製演算法回收垃圾時,可以利用From Survivor和To Survivor來回倒騰存活的物件,提高記憶體利用率和垃圾回收效率。 堆記憶體是公用的,執行緒共享的
,同時堆記憶體會報OutofMemoryError。

方法區

方法區也是公用的,執行緒共享的。方法區存放類的資訊、類欄位、類方法、常量、靜態變數以及及時編譯後的程式碼等資料。在HotSpot虛擬機器中,方法區被稱為永久代。

執行時常量池

執行時常量池是方法區中的一部分,主要存放在編譯期生成的字面量和符號引用,比如常量;在程式執行時也可以將常量放入常量池中,比如String類的intern()方法。 注:以上是自己的個人理解,如有錯誤請指正!

相關推薦

JVM記憶體管理虛擬機器堆疊理解

前言:C或者C++的記憶體申請和銷燬需要程式設計師自己控制,很容易記憶體洩漏和記憶體溢位且出現問題查詢困難。Java在記憶體管理的優勢在於jvm自己申請和銷燬記憶體,不需要程式設計師關注記憶體問題,更專注於業務邏輯。那為什麼我們還需要理解JVM的記憶體管理機制和原理呢?第一

【嵌入式】記憶體管理虛擬儲存

記憶體管理介紹    早期的計算機記憶體容量非常小,當時的PC主要使用DOS作業系統或者其它作業系統。早期的作業系統由於系統硬體的限制,無法支援記憶體管理,應用程式佔用的空間和程式規模都比較小。隨著計算機硬體效能不斷提高,程式的處理能力也不斷提高,應用程式佔用的儲存空間不斷膨

深入理解Java虛擬機器(二) --- JVM記憶體管理

執行時的資料區域 一.程式計數器 目的:作為當前執行緒所執行位元組碼的行號指示器 原理:通過位元組碼直譯器改變計數器的值來選取下一條位元組碼指令 特點: 1.佔用較小的記憶體空間 ​ 2.每條執行緒需要一個獨立的程式計數器 ​ 3.

學習筆記1:深入理解Java虛擬機器——JVM高階特性與最佳實踐_OOM(記憶體溢位)_虛擬機器引數設定_MAT

eclipse中設定debug標籤頁的vm引數 1,Run->Debug configurations->Java Application 2,選中已經寫好的專案 3,Arguments->VM arguments 4,在VM arguments 裡面就可以對虛擬機器的

java虛擬機器記憶體管理機制(一):JVM記憶體管理總結【分享】

近期看了看Java記憶體洩露的一些案例,跟原來的幾個哥們討論了一下,深入研究發現JVM裡面還是有不少以前不知道的細節,這裡稍微剖析一下。先看一看JVM的內部結構——如圖所示,JVM主要包括兩個子系統和兩個元件。兩個子系統分別是Class loader子系統和Execution

Android虛擬機器理解記憶體管理

虛擬機器很小,空間很小,談談移動裝置的虛擬機器的大小限制 16M ,談談載入圖片的時候怎麼處理大圖片的,outmemoryExceptionBitmapFactory.option 垃圾回收,沒有引用的物件,在某個時刻會被系統gc掉 .Dalvik和標準Java虛擬機器(JV

使用qemu-img管理虛擬機器磁碟映象(建立虛擬機器虛擬機器快照)

一臺虛擬機器的核心就是一個磁碟映象,這個映象可以理解成虛擬機器的磁碟,裡面有虛擬機器的作業系統和驅動等重要檔案。本文主要介紹建立虛擬機器的一般過程。 建立虛擬機器映象 要在一臺host上跑起一個虛擬機器一般需要兩個步驟: 第一步:建立虛擬機器映象    

自動記憶體管理機制(1)- java記憶體區域與虛擬機器物件

自動記憶體管理機制(1)- java記憶體區域與虛擬機器物件 1. 執行時資料區域 Java虛擬機器在執行Java程式的過程中會把它所管理的記憶體劃分為若干個不同的資料區域。有的區域隨著虛擬機器進行的啟動而存在,有些區域則以來使用者執行緒的啟動和結束而建立和銷燬。 有以下幾個區域

深入理解jvm(四、虛擬機器效能監控與故障處理工具)

一、命令列工具 1.1 jps:虛擬機器程序狀況工具  1.2 jstat:虛擬機器統計資訊監視工具 假設每250ms查詢一次程序2764垃圾收集狀況,一共查詢20次。 jstat -gc 2764 250 20 例:  S0:倖存

深入理解JVM(七)——虛擬機器類載入機制

虛擬機器類載入機制 虛擬機器把描述類的資料從Class檔案載入到記憶體,並對資料進行校驗,轉換解析,初始化,最終形成可以被虛擬機器直接使用的Java型別,這就是Java的類載入機制。 類的載入,連線,初始化是在程式執行時完成的。 生命週期 載入—->連線(驗證->

詳解:實體地址虛擬地址記憶體管理邏輯地址之間的關係

實體地址:這裡說的實體地址是記憶體中的記憶體單元實際地址,不是外部匯流排連線的其他電子元件的地址!實體地址屬於比較好理解的,實體地址就是記憶體中每個記憶體單元的編號,這個編號是順序排好的,實體地址的大小決定了記憶體中有多少個記憶體單元,實體地址的大小由地址匯流排的位寬決定!虛

KVM搭建及管理虛擬機快建

restart 保存 xml配置 ssis 時間 def rsh kernel ice 一.什麽是虛擬化 1.硬件虛擬化 -一臺物理計算機虛擬出多臺邏輯計算機 -cpu,內存可分配給多個虛擬機 2.軟件虛擬化 -一個LAMP平臺支撐多個網站 -桌

VirtualBox 虛擬機器和宿主機之間的網路連線虛擬機器和主機都可以上網

本篇目的:實現了宿主機與虛擬機器,虛擬機器與虛擬機器互通,宿主機可上網,虛擬機器可上網 第一步:VirtualBox安裝centos7      第一步比較簡單,本篇就不多贅述,本篇重點在於對虛擬機器網路進行配置,下圖是安裝好的centos:

虛擬機器管理虛擬機器傳輸、虛擬機器快照的製作

1.虛擬機器的管理 shut down #正常關機 forceoff #強制關機 virsh list #列出正在執行的虛擬機器 virsh list --all #列出所有的虛擬機器 virsh start deskto

JVM記憶體分析-清晰明瞭非常容易理解

                          JVM的記憶體區域劃分   學過C語言的朋友都知道C編譯器在劃分記憶體區域的時候經常將管理的區域劃分為資料段和程式碼段,資料段包括堆、棧以及靜態資料區。那麼在Java

Nginx實戰 1.7-1.11 Nginx架構分析虛擬機器配置

1.7-1.9 Nginx架構分析 Nginx模組化結構 Nginx涉及到的模組分為核心模組、標準HTTP模組、可選HTTP模組、郵件服務模組以及第三方模組等五大類。 核心模組 核心模組是指Nginx伺服器正常執行時必不可少的模組,它們提供了Nginx最基本最核心的服務,如程序管理、許可

再問jvm記憶體管理

——jvm為什麼年輕代一定要劃分成兩個區域,為什麼老年代不分,為什麼一定要分代。 1、為什麼要分代:   分代的唯一理由就是優化GC效能。如果沒有分代,那我們所有的物件都在一塊,GC的時候我們要找到哪些物件沒用,這樣就會對堆的所有區域進行掃描。而我們的很多物件都是朝生夕死的,如果分代的話,我們把新建立的物

Linux安裝虛擬機器VMware-workstation安裝CentOS作業系統的安裝手冊

                                          &nb

深入淺出 Java 中 JVM 記憶體管理

  Java崗位面試,JVM是對程式設計師基本功考察,通常會問你對JVM瞭解嗎?   可以分幾部分回答這個問題,首先JVM記憶體劃分 | JVM垃圾回收的含義  |  有哪些GC演算法  以及年輕代和老年代各自特點等

深入淺出JVMjvm記憶體結構類載入器圖雙親委託模式記憶體GC解析GC演算法)

目錄 Java虛擬機器的記憶體結構:  類載入器圖: 雙親委託模式: 堆記憶體: GC解析圖: GC演算法 Java虛擬機器的記憶體結構:  類載入器圖:   雙親委託模式: Java允許建立和JDK自帶類