JVM 堆內存分配過程

設置堆內存大小和 OOM

Java 堆用于存儲 Java 對象實例,那么堆的大小在 JVM 啟動的時候就確定了,我們可以通過 -Xmx-Xms 來設定

  • -Xms 用來表示堆的起始內存,等價于 -XX:InitialHeapSize
  • -Xmx 用來表示堆的最大內存,等價于 -XX:MaxHeapSize

如果堆的內存大小超過 -Xmx 設定的最大內存, 就會拋出 OutOfMemoryError 異常。

我們通常會將 -Xmx-Xms 兩個參數配置為相同的值,其目的是為了能夠在垃圾回收機制清理完堆區后不再需要重新分隔計算堆的大小,從而提高性能。

  • 默認情況下,初始堆內存大小為:電腦內存大小/64

  • 默認情況下,最大堆內存大小為:電腦內存大小/4

可以通過代碼獲取到我們的設置值,當然也可以模擬 OOM:

public static void main(String[] args) {//返回 JVM 堆大小long initalMemory = Runtime.getRuntime().totalMemory() / 1024 /1024;//返回 JVM 堆的最大內存long maxMemory = Runtime.getRuntime().maxMemory() / 1024 /1024;System.out.println("-Xms : "+initalMemory + "M");System.out.println("-Xmx : "+maxMemory + "M");System.out.println("系統內存大小:" + initalMemory * 64 / 1024 + "G");System.out.println("系統內存大小:" + maxMemory * 4 / 1024 + "G");
}

?

查看 JVM 堆內存分配

  1. 在默認不配置 JVM 堆內存大小的情況下,JVM 根據默認值來配置當前內存大小

  2. 默認情況下新生代和老年代的比例是 1:2,可以通過 –XX:NewRatio 來配置

    新生代中的 Eden:From Survivor:To Survivor 的比例是 8:1:1,可以通過 -XX:SurvivorRatio 來配置
  3. 若在 JDK 7 中開啟了 -XX:+UseAdaptiveSizePolicy,JVM 會動態調整 JVM 堆中各個區域的大小以及進入老年代的年齡

    此時 –XX:NewRatio-XX:SurvivorRatio 將會失效,而 JDK 8 是默認開啟-XX:+UseAdaptiveSizePolicy

    在 JDK 8中,不要隨意關閉-XX:+UseAdaptiveSizePolicy,除非對堆內存的劃分有明確的規劃

每次 GC 后都會重新計算 Eden、From Survivor、To Survivor 的大小,計算依據是GC過程中統計的GC時間吞吐量內存占用量。

java -XX:+PrintFlagsFinal -version | grep HeapSizeuintx ErgoHeapSizeLimit                         = 0                                   {product}uintx HeapSizePerGCThread                       = 87241520                            {product}uintx InitialHeapSize                          := 134217728                           {product}uintx LargePageHeapSizeThreshold                = 134217728                           {product}uintx MaxHeapSize                              := 2147483648                          {product}
java version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)$ jmap -heap 進程號

?

?

對象在堆中的生命周期

  1. 在 JVM 內存模型的堆中,堆被劃分為新生代和老年代
    • 新生代又被進一步劃分為 Eden區Survivor區,Survivor 區由 From SurvivorTo Survivor 組成
  2. 當創建一個對象時,對象會被優先分配到新生代的 Eden 區
    • 此時 JVM 會給對象定義一個對象年輕計數器-XX:MaxTenuringThreshold
  3. 當 Eden 空間不足時,JVM 將執行新生代的垃圾回收(Minor GC)
    • JVM 會把存活的對象轉移到 Survivor 中,并且對象年齡 +1
    • 對象在 Survivor 中同樣也會經歷 Minor GC,每經歷一次 Minor GC,對象年齡都會+1
  4. 如果分配的對象超過了-XX:PetenureSizeThreshold,對象會直接被分配到老年代

?

對象的分配過程

為對象分配內存是一件非常嚴謹和復雜的任務,JVM 的設計者們不僅需要考慮內存如何分配、在哪里分配等問題,并且由于內存分配算法和內存回收算法密切相關,所以還需要考慮 GC 執行完內存回收后是否會在內存空間中產生內存碎片。

  1. new 的對象先放在伊甸園區,此區有大小限制
  2. 當伊甸園的空間填滿時,程序又需要創建對象,JVM 的垃圾回收器將對伊甸園區進行垃圾回收(Minor GC),將伊甸園區中的不再被其他對象所引用的對象進行銷毀。再加載新的對象放到伊甸園區,然后將伊甸園中的剩余對象移動到幸存者 0 區
  3. 如果再次觸發垃圾回收,此時上次幸存下來的放到幸存者 0 區,如果沒有回收,就會放到幸存者 1 區
  4. 如果再次經歷垃圾回收,此時會重新放回幸存者 0 區,接著再去幸存者 1 區
  5. 什么時候才會去養老區呢? 默認是 15 次回收標記
  6. 在養老區,相對悠閑。當養老區內存不足時,再次觸發 Major GC,進行養老區的內存清理
  7. 若養老區執行了 Major GC 之后發現依然無法進行對象的保存,就會產生 OOM 異常

?

?

GC 垃圾回收簡介? Minor GC、Major GC、Full GC

JVM 在進行 GC 時,并非每次都對堆內存(新生代、老年代;方法區)區域一起回收的,大部分時候回收的都是指新生代。

針對 HotSpot VM 的實現,它里面的 GC 按照回收區域又分為兩大類:部分收集(Partial GC),整堆收集(Full GC)

  • 部分收集:不是完整收集整個 Java 堆的垃圾收集。其中又分為:
    • 新生代收集(Minor GC/Young GC):只是新生代的垃圾收集
    • 老年代收集(Major GC/Old GC):只是老年代的垃圾收集
      • 目前,只有 CMS GC 會有單獨收集老年代的行為
      • 很多時候 Major GC 會和 Full GC 混合使用,需要具體分辨是老年代回收還是整堆回收
    • 混合收集(Mixed GC):收集整個新生代以及部分老年代的垃圾收集
      • 目前只有 G1 GC 會有這種行為
  • 整堆收集(Full GC):收集整個 Java 堆和方法區的垃圾

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/43821.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43821.shtml
英文地址,請注明出處:http://en.pswp.cn/web/43821.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Hadoop-15-Hive 元數據管理與存儲 Metadata 內嵌模式 本地模式 遠程模式 集群規劃配置 啟動服務 3節點云服務器實測

章節內容 上一節我們完成了: Hive中數據導出:HDFSHQL操作上傳內容至Hive、增刪改查等操作 背景介紹 這里是三臺公網云服務器,每臺 2C4G,搭建一個Hadoop的學習環境,供我學習。 之前已經在 VM 虛擬機上搭建過一次&am…

簡單的基追蹤一維信號降噪方法(MATLAB 2018)

基追蹤法是基于冗余過完備字典下的一種信號稀疏表示方法。該方法具有可提高信號的稀疏性、實現閾值降噪和提高時頻分辨率等優點。基追蹤法采用表示系數的范數作為信號來度量稀疏性,通過最小化l型范數將信號稀疏表示問題定義為一類有約束的極值問題,進而轉…

c++ primer plus 第15章友,異常和其他 15.3.11 有關異常的注意事項

c primer plus 第15章友,異常和其他 15.3.11 有關異常的注意事項 15.3.11 有關異常的注意事項 文章目錄 c primer plus 第15章友,異常和其他 15.3.11 有關異常的注意事項15.3.11 有關異常的注意事項 15.3.11 有關異常的注意事項 從前面關于如何使用異常…

vue實現表單輸入框數字類型校驗功能

vue實現表單輸入框數字類型校驗功能 1. 樣式代碼 <el-form-item label"訂單總價"><el-input size"small" v-model"form.totalPrice" placeholder"請輸入訂單總價 正整數或者2位數小數" input"check(form.totalPric…

SpringSecurity中文文檔(Servlet Authorize HttpServletRequests)

Authorize HttpServletRequests SpringSecurity 允許您在請求級別對授權進行建模。例如&#xff0c;對于 Spring Security&#xff0c;可以說/admin 下的所有頁面都需要一個權限&#xff0c;而其他所有頁面只需要身份驗證。 默認情況下&#xff0c;SpringSecurity 要求對每個…

Umi.js 項目中使用 Web Worker

1.配置 Umi.js 在 Umi.js 中&#xff0c;需要通過配置來擴展 Webpack 的功能。在項目根目錄下修改 config/config.ts 文件&#xff1a; export default defineConfig({chainWebpack(config) {config.module.rule(worker).test(/\.worker\.ts$/).use(worker-loader).loader(wo…

C語言之指針的奧秘(二)

一、數組名的理解 int arr[10]{1,2,3,4,5,6,7,8,9,10}; int *p&arr[0]; 這里使用 &arr[0] 的?式拿到了數組第?個元素的地址&#xff0c;但是其實數組名本來就是地址&#xff0c;而且是數組首元素的地址。如下&#xff1a; 我們發現數組名和數組?元素的地址打印出…

重要文件放u盤還是硬盤?硬盤和u盤哪個適合長期存儲

在數字時代&#xff0c;我們每天都會處理大量的文件。其中&#xff0c;不乏一些對我們而言至關重要的文件&#xff0c;如家庭照片、工作文檔、財務記錄等。面對這些重要文件的存儲問題&#xff0c;我們通常會面臨&#xff1a;“重要文件放U盤還是硬盤”、“硬盤和U盤哪個適合長…

Vue2打包部署后動態修改后端接口地址的解決方法

文章目錄 前言一、背景二、解決方法1.在public文件夾下創建config文件夾&#xff0c;并創建config.js文件2.編寫config.js內容3.在index.html中加載config.js4.在封裝axios工具類的js中修改配置 總結 前言 本篇文章將介紹使用Vue2開發前后端分離項目時&#xff0c;前端打包部署…

系統架構師考點--系統安全

大家好。今天我來總結一下系統安全相關的考點&#xff0c;這類考點每年都會考到&#xff0c;一般是在上午場客觀題&#xff0c;占2-4分。 一、信息安全基礎知識 信息安全包括5個基本要素&#xff1a;機密性、完整性、可用性、可控性與可審查性 (1)機密性&#xff1a;確保信息…

Navicat導入sql文件

文章目錄 Navicat導入SQL文件&#xff0c;使用默認導入&#xff0c;不做任何修改報錯嘗試一修改運行時的選擇 嘗試二修改my.ini的配置文件 Navicat導入SQL文件&#xff0c;使用默認導入&#xff0c;不做任何修改報錯 嘗試一 修改運行時的選擇 取消勾選 ‘每個運行中運行多重查…

C++ 判斷語句的深入解析

C++ 判斷語句的深入解析 C++ 是一種廣泛使用的編程語言,以其高效性和靈活性著稱。在 C++ 中,判斷語句是控制程序流程的關鍵組成部分,它們允許程序根據不同的條件執行不同的代碼路徑。本文將深入探討 C++ 中的判斷語句,包括 if、else if、else 以及 switch 語句,并展示如何…

3,區塊鏈加密(react+區塊鏈實戰)

3&#xff0c;區塊鏈加密&#xff08;react區塊鏈實戰&#xff09; 3.1 哈希3.2 pow-pos-dpos3.3非對稱加密&#xff08;1&#xff09;對稱加密AES&#xff08;2&#xff09;非對稱加密RSA 3.4 拜占庭將軍3.5 P2P網絡3.6 區塊鏈 3.1 哈希 密碼學&#xff0c;區塊鏈的技術名詞 …

在Spring Boot項目中集成單點登錄解決方案

在Spring Boot項目中集成單點登錄解決方案 大家好&#xff0c;我是微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 在現代的企業應用中&#xff0c;單點登錄&#xff08;Single Sign-On, SSO&#xff09;解決方案是確保用戶…

【Git的基本操作】版本回退 | 撤銷修改的三種情況 | 刪除文件

目錄 5.版本回退 5.1選項hard&后悔藥 5.2后悔藥&commit id 5.3版本回退的原理 6.撤銷修改 6.1情況一 6.2情況二 6.3情況三 ?7.刪除文件 Git重要能力之一馬&#xff0c;版本回退功能。Git是版本控制系統&#xff0c;能夠管理文件歷史版本。本篇以ReadMe文件為…

神器!3個免費PPT成品網站推薦+3款AIPPT工具盤點!

熬夜加班做PPT卻沒有頭緒&#xff1f;別再自己憋著想了&#xff01;現在凡事主打一個“抄作業”&#xff0c;想做ppt卻沒想法&#xff0c;可以去到ppt成品網站搜集PPT模板&#xff0c;或是使用時下流行的AI生成PPT工具&#xff0c;只需輸入PPT主題&#xff0c;即可快速生成一份…

全網最詳細的CRC講解即計算

CRC 循環冗余碼&#xff08;Cyclic Redundancy Code&#xff0c; CRC&#xff09;是一種用于校驗通信鏈路上數字傳輸準確性的計算方法&#xff08;通過某種數學運算來建立數據位和校驗位(CRC)的約定關系的&#xff09;。它是利用除法以及余數的原理來作錯誤偵測。 發送方: 使用…

客戶關系管理怎么做?這4個工具一定要會用!

在商海浮沉中&#xff0c;每一位企業家和銷售經理都深知&#xff0c;客戶是企業生存與發展的基石。但如何有效管理這些寶貴的資源&#xff0c;讓每一次互動都成為加深關系、促進成交的契機&#xff0c;卻是一門藝術加科學的結合體。今天&#xff0c;咱們就來聊聊客戶關系管理&a…

3SRB5016-ASEMI逆變箱專用3SRB5016

編輯&#xff1a;ll 3SRB5016-ASEMI逆變箱專用3SRB5016 型號&#xff1a;3SRB5016 品牌&#xff1a;ASEMI 封裝&#xff1a;SGBJ-5 批號&#xff1a;2024 現貨&#xff1a;50000 最大重復峰值反向電壓&#xff1a;1600V 最大正向平均整流電流(Vdss)&#xff1a;50A 功…

CNN -1 神經網絡-概述

CNN -1 神經網絡-概述 一:芯片科技發展介紹了解1> 芯片科技發展趨勢2> 芯片使用領域3> 芯片介紹1. 神經網絡芯片2. 神經網絡處理單元NPU(Neural Processing Unit)二:神經網絡1> 什么是神經網絡2> 神經元3> 人工神經網絡三:卷積神經網絡(CNN)入門講解一…