JVM的記憶體分區

来源:https://www.cnblogs.com/luojiahu/archive/2018/01/07/8231502.html
-Advertisement-
Play Games

JVM的記憶體分區 這篇文章嘗試討論清楚JVM的記憶體分區情況。 1. JVM的記憶體和系統記憶體的關係 下圖是對系統記憶體及JVM記憶體的大致描繪 對大多數操作系統,記憶體可以分為物理記憶體RAM及Swap(交換區)兩大部分,Swap Space在物理上是一塊獨立的磁碟區域,當操作系統發現記憶體不夠使用時,便開始使 ...


JVM的記憶體分區

這篇文章嘗試討論清楚JVM的記憶體分區情況。

1.       JVM的記憶體和系統記憶體的關係

下圖是對系統記憶體及JVM記憶體的大致描繪

 

對大多數操作系統,記憶體可以分為物理記憶體RAM及Swap(交換區)兩大部分,Swap Space在物理上是一塊獨立的磁碟區域,當操作系統發現記憶體不夠使用時,便開始使用交換區。

在系統層面,Linux系統的記憶體大致可以劃分為:

  1. BIN,內核引導記憶體
  2. Kernel Space(內核記憶體),操作系統進行程式調度,記憶體分配,硬體資源管理等動作需要的記憶體
  3. User Space(用戶記憶體),提供給各個進程使用

一個JAVA程式開始運行之後,是存在於系統之上的一個進程。這個進程所占用的記憶體由JVM管理。

2.       JVM記憶體的劃分

JVM的記憶體可以劃分為以下幾個主要部分:

 

  1. Program Counter Register,程式計數器,線程私有,是一塊較小的記憶體空間,可以理解為當前線程執行位元組碼的行號指示器。
  2. Method Area,方法區,由各線程共用,用於載入類信息,常量,靜態變數等數據。在HotSpot虛擬機的實現中,稱這部分記憶體為Permanent Generation(永久代),這使得虛擬機可以像管理堆記憶體一樣對這部分記憶體進行管理,可以通過參數-XX:MaxPermSize指定永久代的上限。而在其他虛擬機實現中並未使用永久代來實現方法區。當方法區無法滿足記憶體分配需要時,便會拋出OutOfMemoryError。
  3. Java Heap,堆,線程共用,對大部分應用來說,這是JVM種最大的一塊記憶體區域。JVM規範規定:所有的對象實例和數組都要在堆上分配。

堆是記憶體回收的主戰場,因此由稱為Garbage Collected Heap(GC堆),在分代收集策略下。堆可以進一步劃分為新生代和老年代,更細緻的:

  • Eden區,對象第一次創建時,從Eden區開闢空間
  • Survivor區,當Eden區不足以進行下次記憶體分配時,JVM觸發一次GC,經過GC但未被回收的對象,被轉移到Survivor區。Survivor分為From,To兩部分,多次記憶體回收時未被回收的對象在這兩塊區域中來迴轉移。
  • Old區,當經過一定次數的GC後仍未被回收的對象,JVM將其轉移到老年代區

  4. JVM Stack,JAVA虛擬機棧,線程私有,其生命周期與對應的線程相同。當每個方法執行時,均會創建一個棧幀(Stack Frame)用於存儲局部變數表,操作數棧,動態鏈接,方法出口等信息。每個方法的執行和完成,便對應著Stack Frame在虛擬機棧中的出棧和入棧的過程。通常意義上粗糙地將JVM記憶體劃分為堆和棧,其中的棧便指的是JVM Stack.

  5. Native Method Stack,本地方法棧,與JVM Stack類似,本地方法棧對應的是Native方法的執行管理。

此外,程式運行所需要的記憶體開闢在JVM的記憶體空間中,也可以直接申請系統記憶體(Directive Memory),但是直接申請的系統記憶體不受JVM的垃圾回收管理,其釋放由系統層面控制,因此對於不關註記憶體回收的JAVA程式員來說,容易導致記憶體溢出等問題的發生。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 相關介紹:  二叉樹的三種遍歷方式(先序遍歷,中序遍歷,後序遍歷)的非遞歸實現,雖然遞歸方式的實現較為簡單且易於理解,但是由於遞歸方式的實現受其遞歸調用棧的深度的限制,當遞歸調用的深度超過限制的時候,會出現拋出異常的情況。為此,通過顯示的使用棧的方式來實現二叉樹遍歷的非遞歸方式,其在使用上 ...
  • 一:面向對象編程 1 面向對象編程——Object Oriented Programming,簡稱OOP,是一種程式設計思想。OOP把對象作為程式的基本單元,一個對象包含了數據和操作數據的函數。 2 面向對象與面向過程的區別: a 面向過程的程式設計把電腦程式視為一系列的命令集合,即一組函數的順序 ...
  • Java中String、StringBuffer、StringBuilder的區別 1.從是否可變的角度 String類中使用字元數組保存字元串,因為有“final”修飾符,所以String對象是不可變的。 StringBuffer和StringBuilder都繼承自AbstractStringBu ...
  • 經過上一篇的介紹,相信小伙伴們已經按奈不住內心對springboot的嚮往,本篇我將繼續向小伙伴介紹springboot配置文件的配置,已經全局配置參數如何使用,好了下麵開始我們今天的內容介紹。 我們知道Spring Boot支持容器的自動配置,預設是Tomcat,當然我們也是可以進行修改的: 1、 ...
  • 一:模塊 1 在Python中,一個.py文件就稱之為一個模塊(Module) 2 Python的好處,優點: a 提高了代碼的可維護性 b 當一個模塊編寫完畢,就可以被其他地方引用。我們在編寫程式的時候,也經常引用其他模塊,包括Python內置的模塊和來自第三方的模塊。 3 使用模塊還可以避免函數 ...
  • 這東西一時半會兒寫不完。。。 群 定義集合$G={a,b,c,\ldots}$,$*$為集合$G$上的二元運算 當集合$G$在運算$*$之下滿足一下性質時,我們稱集合$G$在運算$*$之下是一個群,簡稱$G$是群 封閉性:$\forall a,b\in G,\exists c\in G,a^{\as ...
  • 安全性 a、 編寫線程安全的代碼,其核心在於要對狀態的訪問、更改等操作進行管理,特別是對共用的、可變的狀態的訪問。java中主要的同步機制有synchronized(獨占鎖)、volatile類型的變數、顯式鎖、原子變數。 b、修複同步問題的方式: 1、不線上程之間共用該狀態變數 2、將狀態變數修改 ...
  • 1、什麼是python 引用官方的話:Python是一種易於學習,強大的編程語言。它具有高效的高級數據結構,並通過簡單而有效的方法來進行面向對象編程。Python的優雅語法和動態類型,以及其解釋性質,使其成為在大多數平臺上的許多領域的腳本和快速應用程式開發的理想語言。 這段話怎麼理解呢?我們知道,任 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...