成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

你真的了解JVM?JVM中有哪些內存區域,都有哪些作用?

云計算 虛擬化
什么是JVM內存區域劃分?其實這個問題非常簡單,JVM在運行我們寫好的代碼時,他是必須使用多塊內存空間的,不同的內存空間用來放不同的數據,然后配合我們寫的代碼流程,才能讓我們的系統運行起來。

1.0 前言

之前我們探討過一個.class文件是如何被加載到jvm中的。但是jvm內又是如何劃分內存的呢?這個內被加載到了那一塊內存中?jvm內存劃分也是面試當中必被問到的一個面試題。

1.1 什么是JVM內存區域劃分?

其實這個問題非常簡單,JVM在運行我們寫好的代碼時,他是必須使用多塊內存空間的,不同的內存空間用來放不同的數據,然后配合我們寫的代碼流程,才能讓我們的系統運行起來。

舉個最簡單的例子,比如咱們現在知道了JVM會加載類到內存里來供后續運行,那么我問問大家,這些類加載到內存以后,放到哪兒去了呢?想過這個問題嗎?

所以JVM里就必須有一塊內存區域,用來存放我們寫的那些類。

包括我們定義的成員變量,類變量,方法,局部變量等等,都在jvm內存中對應著一塊內存來記錄存儲。

2.0 存放類的方法區

在JDK1.8之前的版本里,代表JVM的一塊區域。在1.8版本以后,這塊區域的名字改了,叫做“Matespace”,可以認為是“元數據空間”這樣的意思,當然這里主要存放的還是我們自己寫的各種類的相關信息。

舉個栗子。有如下兩個類,People類沒有成員變量,而Student類有一個name的類變量。

  1. public class Student{ 
  2.  private static String name = "lisi"
  3. public class People{ 
  4.  public static void main(){ 
  5.  Student student = new Student(); 
  6.  } 

這兩個類被加載到JVM,就會存放在這個方法區里面(注意:如果讀過我之前的章節,就會明白這里的加載代表的是:加載->驗證->準備->解析->初始化,類的所有類變量都會被賦值)。如下圖

 

你真的了解JVM?JVM中有哪些內存區域,都有哪些作用?

 

3.0 執行程序代碼指令的計數器

我們知道,被加載到jvm的類對象是我們寫的.java文件被編譯之后的.class文件。

在編譯過后會將我們的代碼編譯成計算機能讀懂的字節碼。而這個.calss文件就是,就是我們代碼編譯好的字節碼了。

加載到內存以后,字節碼執行引擎就開始工作了。去執行我們編譯出來的代碼指令,如下圖

 

你真的了解JVM?JVM中有哪些內存區域,都有哪些作用?

 

此時問題來了,我們是不是需要一塊內存空間來記錄我們字節碼執行引擎目前執行到了哪行代碼?這一塊特殊的內存區域就是“程序計數器”

這個程序計數器就是用來記錄當前執行的字節碼指令的位置。

如下圖:

 

你真的了解JVM?JVM中有哪些內存區域,都有哪些作用?

 

到這里我相信會有人產生疑惑,就按照當前的代碼順序執行就行了,為什么要記錄執行到哪里了?

因為我們寫好的代碼可能會開啟多個線程并發的執行不同的代碼。可能當前線程這段代碼還沒有執行完畢,就上下文切換到另一段代碼中。

當線程再次上下文切換到之前的代碼時,就需要一個專門記錄當前線程執行到了哪一條字節碼。所以,每一個線程都有這自己的程序計數器。

如下圖:

 

你真的了解JVM?JVM中有哪些內存區域,都有哪些作用?

 

4.0 Java虛擬機棧

java代碼在執行的時候,一定是某個線程來執行某個方法中的代碼。

當線程執行到某個方法的時候,如果這個方法有局部變量,那么就需要一塊區域來存放局部變量的數據信息。這個區域就叫做java虛擬機棧。

每一個線程都有一個自己的java虛擬機棧,比如說當執行main方法的時候就會有一個main線程,用來存放main方法中定義的局部變量

  1. public static void main(){ 
  2.  People people = new People(); 
  3.  int i = 9; 

比如上面的main()方法中,其實就有一個"people"的局部變量,他是引用一個People的實例對象的,這個對象我們先不管他。然后有一個"i"的局部變量。

如下圖:

你真的了解JVM?JVM中有哪些內存區域,都有哪些作用?

我想大家應該都知道棧的數據結構,后進先出。當方法執行完畢以后,這個棧楨就會出棧,里面的局部變量信息就會從內存刪除。所以局部變量是線程安全的。因為只有當前線程能獲取到這個值。

為什么要用后進先出的數據結構?

假設a方法當中同步調用b方法,此時a方法的棧楨先入棧,然后再是b方法的棧楨入棧。b方法執行完畢后,b方法的棧楨出棧,繼續執行a方法。所以使用一個后進先出的棧結構是非常***的。

此時jvm的內存模型圖如下:

 

你真的了解JVM?JVM中有哪些內存區域,都有哪些作用?

5.0 Java虛擬機堆內存

這一塊內存是非常非常重要的。

我們實例化的所有對象都是存放在這個內存中。這個實例化的對象里面會包含一些數據,我們用上面的代碼來做栗子。

  1. public class Student{ 
  2.  private String name = "lisi"
  3.  public String getNmae(){ 
  4.  return name
  5.  } 
  6. public class People{ 
  7.  public static void main(){ 
  8.  Student student = new Student(); 
  9.  student.getName(); 
  10.  } 

還是這個代碼,當main線程執行main()方法的時候,首先在堆內存中實例化Student對象,然后在局部變量中創建student,student存的是實例化Student對象的內存地址。然后執行Student對象的getName()方法。

如下圖:

由上圖可以看出來,棧空間是封閉的,是線程安全的,而堆內存中是我們主要發生線程不安全的地方,因為堆內存的空間所有的線程其實都是能共享的。

此時jvm的內存劃分的最終模型為:

[[270808]]

6.0 其他區域內存

很多java程序猿對這一塊區域的接觸是非常少的。

其實在JDK的很多底層代碼API中,比如NIO。

如果你去看源碼會發現很多地方的代碼不是java寫的,而是走的native方法去調用本地操作系統里面的一些方法,可能調用的都是c語言寫的方法。

比如說:public native int hashCode();

在調用這種native方法的時候,就會有線程對應的本地方法棧,這個其實類似于java虛擬機棧。也是存放各種native方法的局部變量表之類的信息。

還有一塊區域,是不是jvm的,通過NIO中的allocateDirect這種API,可以在jva堆外分配內存空間,然后通過java虛擬機棧里的DirectByteBuffer來引用和操作堆外內存空間。

7.0 總結

基本上jvm的核心內存區域的功能都解釋清楚了,面試能回答到這一個地步應該也能順利通過了。

我們需要重點關注的是方法區,程序計數器,java虛擬機棧和java堆內存這些內存區域的作用。

責任編輯:武曉燕 來源: 博客園
相關推薦

2022-07-05 08:34:22

虛擬機JavaJVM

2010-09-25 12:54:24

JVM內存

2024-11-13 11:12:08

JVM內存區域

2010-09-27 09:31:42

JVM內存結構

2024-08-02 14:52:00

2021-11-26 00:00:48

JVM內存區域

2024-11-15 09:14:23

JDK4NIO函數

2015-12-28 11:41:57

JVM內存區域內存溢出

2017-09-20 08:48:09

JVM內存結構

2021-03-15 08:11:40

JVM回收堆內存

2013-03-29 11:09:17

JVM內存

2020-08-10 17:49:25

JVM內存溢出

2022-11-04 13:06:47

JVMJava程序

2012-01-11 10:45:57

JavaJVM

2023-05-29 07:43:32

JVM內存調優

2024-03-07 17:21:12

HotSpotJVMHot Code

2021-06-06 13:06:34

JVM內存分布

2021-01-26 15:44:50

人工智能機器學習疫情

2023-11-19 23:29:22

Heap DumpJava

2020-04-22 14:41:17

JVM參數函數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费久久网站 | 久久日韩粉嫩一区二区三区 | 99精品一区 | 一级高清视频 | 成人a视频 | 黄色网址av | 亚洲精品在线视频 | 欧美精品一区二区三区在线 | 一级女毛片 | 国产又爽又黄的视频 | 亚洲五码久久 | 欧美精品一区二区三区在线 | 成人不卡一区二区 | 在线婷婷 | 欧美性乱 | 欧美1区| 黑人粗黑大躁护士 | 日本一区二区在线视频 | 国产精品久久一区二区三区 | 欧美综合国产精品久久丁香 | 日本特黄a级高清免费大片 国产精品久久性 | 欧美国产精品一区二区三区 | 中文字幕av一区 | 日韩视频免费看 | 一级黄在线观看 | 每日更新av | 国产精品一区二区福利视频 | 一区二区三区四区视频 | 综合二区 | 国产激情一区二区三区 | 精品一区二区在线观看 | 午夜影院在线观看版 | 免费观看日韩精品 | 中文字幕一区二区三区日韩精品 | 精品久久久久久 | 一级片av | 91在线精品播放 | 婷婷午夜天 | a在线免费观看视频 | 欧美 日本 国产 | 欧美二级 |