JVM內存你必須瞭解的【堆-棧-方法區】(面試必備)

0x01.JVM內存劃分關係

JVM體系結構(簡單版)

在這裏插入圖片描述

運行時數據區的主要作用:

區域名稱 實際作用
寄存器 保存有當前正在執行的JVM指令的地址。
本地方法棧 爲JVM使用到的Native方法服務
方法區 存儲可執行的.class文件
堆內存 存儲數組或者對象
方法棧 方法運行時使用的內存

本文主要研究運行時數據區中的堆,棧,方法區


0x02.分析一段簡單代碼,瞭解數組數組創建過程

  • 看一下下面這段代碼:
public stativ void main(String args[]){
	int[] a=new int[5];
	System.out.println(a);
}	
  • 相信大家很容易知道,輸出的內容就是a數組在內存中的地址。
  • 那這個地址實際上指的是哪裏呢?
  • 我們一起分析一下這個程序的運行流程:

僅分析一下主要new出數組的過程,其它的細節此處省略。

堆棧上的主要執行流程:

1.main方法入棧:

在這裏插入圖片描述

2.讀取new語句,在堆中開闢空間,存儲數據:

  • 堆會給數組分配初始值。
    在這裏插入圖片描述

  • 到這裏,我們應該就可以知道,實際的地址是在堆中分配的地址。

0x03.通過堆-棧-方法區,瞭解對象在內存中存儲

  • 再來看一段簡單的代碼:
  • 一個People類:
public class Peolple{
	String name;
	int age;
	String sex
	
	public void eat{
		System.out.println("吃飯");
	}
}
  • main方法:
public static void main(String args[]){
	Perple people=new People();
	people.name="ATFWUS";
	people.age=18;
	people.sex="man";
	people.eat();
}

內存結構分析(單個對象):

在這裏插入圖片描述

0x04.細究堆-棧-方法區在內存中的作用

  • 堆和棧的關係用一句話描述就是:棧管運行,堆管存儲

1.堆

  • 主要:用來存放程序動態生成的數據

  • 重點:堆是內存中共享的區域,要考慮線程安全的問題。

  • 凡是new出來的對象,都在堆中:

    • 存儲的是成員變量。
    • 靜態變量存儲在方法區。
    • 而成員變量的值存儲在常量池中。
    • 成員方法存儲在方法區中,是此類所有實現實例共享的。
  • 常量池:

    • 常量池在堆中。
    • JVM爲每一個加載的類維護一個常量池。
    • 用於存儲成員變量中的數值。

2.棧

  • 棧是線程獨享的。每一個線程都有自己的線程棧。

  • 棧的生命週期跟隨線程的生命週期。

  • 棧存儲的數據:(棧幀)

    • ① 本地變量 : 參數,返回值,方法內的變量;
    • ② 棧操作 : 棧指針(ebp,esp);
    • ③ 棧幀數據 : 類文件、方法等。
  • 棧是方法運行時使用的內存。

3.方法區

  • 供各線程 共享 的運行時內存區域。

  • 存儲了每一個類的結構信息。

  • 方法區主要用於存儲已經被虛擬機加載的類的信息、常量、靜態變量等。

    • 在JVM加載某個類時,會抽取出對應.class文件中類相關的信息並以特定結構存到方法區中,當程序運行時,JVM則會到方法區中去查找使用對應類信息。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章