網站首頁 編程語言 正文
文章目錄
- @[TOC](文章目錄)
- 一、JMM(內存模型)
- 內存劃分
- 二、堆區
- 堆區劃分
- 對象分配內存
文章目錄
- @[TOC](文章目錄)
- 一、JMM(內存模型)
- 內存劃分
- 二、堆區
- 堆區劃分
- 對象分配內存
一、JMM(內存模型)
在了解對象創建并分配內存前,首先了解一下Java的內存模型。Java編程不再像c++/c語言需要開發人員管理內存,而是將內存管理交給了JVM虛擬機,從而也將開發人員從內存管理中解脫出來。那么Jvm虛擬機是如何實現內存管理的呢?
內存劃分
在JDK7之前,JVM啟動時會創建堆區 (Heap) 和 方法區 (Method Area);而在JDK8以后,創建的為堆區 (Heap) 和 元空間 (MetaSpace)。而這兩個區域都是線程共享,但線程也存在私有區域:程序計數器、本地方法棧、虛擬機棧 。我們今天將創建對象為其分配內存空間,那么它是存在那塊區域呢?當然是堆區,那它如何在堆區存儲、管理呢?那就得先了解一下堆區的劃分。
二、堆區
堆區劃分
堆區是JVM所管理的內存中最大的一塊,堆區中幾乎存放了所有對象的實例,既然存放了大量對象的實例及數組,那是如何管理呢?那就涉及到分代思想,堆區將每個對象當成有生命的個體將其劃分為:新生代、老年代,新生代又被劃分為三個區域:Eden(伊甸區)、s0(survivor)、s1(survivor)。
對象分配內存
- 創建一個新對象,Eden區就是對象最開始誕生的區域
- 如果Eden區內存充足時,直接為其分配內存
- 如果Eden區沒有那么大的內存存儲該對象,則觸發YGC垃圾回收機制,通過整理Eden區的內存判斷該對象是否可以被存儲
- 如果通過YGC回收機制后發現Eden區有足夠的空間可以存儲該對象,則為其分配空間
- 如果已經觸發YGC機制并回收了,內存空間依舊不充足,則考慮將其存儲至老年代
- 如果老年代的內存充足,則為其分配空間
- 如果老年代的內存依舊不足以存儲該對象,則觸發FULL GC回收機制,通過整理老年代的內存,判斷該空間是否可以存儲該對象
- 如果可以存儲該對象,則為其分配空間
- 如果還不可以存儲該對象,那么該對象已經超出內存所剩的空間,則拋出內存溢出的異常
- 那么survivor區存在的意義是什么呢?
Enden區存儲滿時,會將一部分對象存儲至survivor區,兩個survivor區相當于是輔助,幫助Eden區存儲管理對象實例、數組等- 其實Enden區存儲滿時,將一部分對象存儲至s0,當觸發YGC回收機制時,又會將對象存儲至s1,連同s0中的對象存儲至s1中。當對象從s0至s1的過程中對象的年齡則會+1,當對象的年齡超出15歲,則該對象將會被存儲值老年代
- 其實Enden區存儲滿時,將一部分對象存儲至s0,當觸發YGC回收機制時,又會將對象存儲至s1,連同s0中的對象存儲至s1中。當對象從s0至s1的過程中對象的年齡則會+1,當對象的年齡超出15歲,則該對象將會被存儲值老年代
原文鏈接:https://blog.csdn.net/qq_55135629/article/details/126917241
相關推薦
- 2023-03-15 Python多進程協作模擬實現流程_python
- 2023-04-12 C#?DataGridView行列轉換的具體實現_python
- 2023-01-02 如何用C#找出數組中只出現了一次的數字_C#教程
- 2022-07-20 python密碼學列置換密碼學習_python
- 2022-07-10 springboot 將logback日志根據不同類輸入到不同路徑下
- 2022-12-04 Flask帶參URL傳值的實現方法_python
- 2024-03-25 使用HttpURLConnection發送POST請求并攜帶請求參數
- 2022-01-23 win7下與Virtualbox下的ubuntu11.04共享文件夾
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支