日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

創建的對象如何在堆區分配內存

作者:MM呦 更新時間: 2022-09-25 編程語言

文章目錄

    • @[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歲,則該對象將會被存儲值老年代
      在這里插入圖片描述

原文鏈接:https://blog.csdn.net/qq_55135629/article/details/126917241

欄目分類
最近更新